2009-07-03 28 views
1

我有一個非常簡單的.NET控制檯應用程序。我希望通過一些命令行參數......在那裏沒有任何困難。試圖閱讀控制檯應用程序的某些命令行參數

現在,踢球者,我通常有一個項目的列表,我希望通過一個參數。在這種情況下,文件列表。我不確定最好的方法來做到這一點。

eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt 

但是那些帶空格的文件名呢?我應該用逗號對它進行整理嗎?

使事情變得有趣,我有其他指定參數時,它接受單值..所以我不知道我是否應該把所有的ARG數據在雙引號..

eg. myapp.exe files=aaa.txt,bbb.txt formatting=true foo=hello 

eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello" 

回答

2

可能有點晚了節目您正在使用的,但這裏的你如何能使用Mono.Options

static void Main(string[] args) 
{ 
    //let's try this mono.options thing shall we? 
    string xapfile = null; 
    var files = new List<string>(); 
    var p = new Mono.Options.OptionSet() 
    { 
     { "xap=", v => xapfile =v }, 
     { "file:", v => files.Add(v)} 
    }; 
    List<string> extra = p.Parse(args); 


    Console.WriteLine(@" 
    xap = '{0}', 
    file(s)= {1}", 
     xapfile, 
     string.Join(",", files.ToArray()) 
    ); 
    Console.WriteLine(@" 
    left overs: {0}", 
     string.Join(Environment.NewLine, extra.ToArray()) 
    ); 
    // rest of your Main here 

調用語法將

myapp.exe --file="file 1" --file="file 2" --file="file 3"

你甚至可以放棄這樣做整個文件變量,只是將左邊的文件視爲文件,並將其稱爲myapp.exe "file 1" "file 2" "file 3",並將文件從額外列表中拔出。

Mono.Options非常強大。你甚至不必使用 - ,看起來你可以使用/file=-file=

不幸的是,Windows不會爲你做globbing(除非你將選項傳遞給powershell cmdlet),所以你有自己動手做。這是很容易做的,here's的碼位我已經在過去用於擴大*.foo"c:\temp\*.bar|c:\temp\*.txt"

而且,除非你包在對講機中的文件名,我可能不會逗號分隔的列表,如逗號是有效的在一個文件名。你知道有一天你會咬你的:-)管道是一個不錯的選擇,但只有當你把整個表情包裹在談話中時,否則窗戶就會認爲你在做管道。啊,命令行處理的樂趣:-)

0

每個參數,如果它包含任何空格,都必須用引號引起來。否則,我會留下引號。

0

鑑於你的shell可能支持wild card globbing最好允許輸入文件是一個純空格分隔列表,並假設如果一個文件名包含空格,它將已被轉義或通過引號\字符。 明白我的意思是不包含--f或/ f風格的開關。

一個稍微不常用的技術,但並不支持所有執行命令行解析的庫,它允許多個條目-f foo.txt -f bar.txt。這與命令行通配不匹配(與上述解決方案不同)。

相關問題