2012-09-05 33 views
1

我試圖將引號中的星號符號作爲命令行參數傳遞給我的控制檯應用程序,當我使用System.Environment.getArgs時,我實際上獲取當前目錄中的文件列表。這是錯誤的,因爲我將星號包裹在引號中,所以引號中的文本不應該被替換。如何在cygwin下的Windows中獲得沒有這種替換的命令行參數?在cygwin下的Windows上的getArgs的錯誤行爲

+2

這似乎更像是一個窗口的問題比Haskell的。 –

+0

你使用單引號還是雙引號? –

+0

這是您的shell的問題,而不是'getArgs'。在將任何參數發送到您的程序之前,執行Globbing。 – valderman

回答

2

如果你將其括在單引號,'*'它不會擴大,但兩個引號打通進入getArgs結果(見下文),所以你需要在以後將其刪除。

"*"在windows中被擴展的原因是由於空格,引入的逗號作爲globbable文件名的一部分是合法的。某些時候你可能想要del "temp file *.dat"

module ListArgs where 
import System.Environment 
main = getArgs >>= print 

給出:

[1 of 1] Compiling ListArgs    (ListArgs.hs, ListArgs.o) 
Linking ListArgs.exe ... 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe * 
["HereDoc.hs","IOutils.lhs","SugaredApplicative.hs","ListArgs.exe","ListArgs.hi","ListArgs.hs","ListArgs.o"] 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe "*" 
["HereDoc.hs","IOutils.lhs","SugaredApplicative.hs","ListArgs.exe","ListArgs.hi","ListArgs.hs","ListArgs.o"] 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe '*' 
["'*'"] 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe '* 
["'*"] 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe -* 
["-*"] 
+0

AndrewC,謝謝你的回答,單引號在cmd.exe中確實有效。然而,在cygwin下它不起作用,我仍然得到當前目錄中的文件列表。 - *無處不在。 –

+0

使用前綴和單引號是一種解決方法,對於用戶來說顯然不是。開發人員也應該記住Windows中的這種行爲,並以某種方式從輸入中消除不需要的符號。我寧願有一個不做這種替換的函數。但似乎Haskell平臺不提供這樣的功能。很遺憾。 –

+0

我幾年沒用過cygwin。我會添加一個標籤來擴大觀衆。 – AndrewC