尝试读入控制台应用程序的一些命令行参数

时间:2009-07-03 07:25:14

标签: .net command-line console-application

我有一个非常简单的.NET控制台应用程序。我希望传递一些命令行参数......那里没什么难的。

现在,踢球者,我通常有一个我希望传递的项目列表,一个参数。在这种情况下,文件列表。我不确定这样做的最好方法。

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

但是有空格的文件名呢?我可以用逗号来制作吗?

为了让事情变得有趣,我有其他的args,它接受单个值..所以我不确定我是否应该将所有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"

3 个答案:

答案 0 :(得分: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不会为您执行通配(除非您将选项传递给PowerShell cmdlet),因此您必须自己执行此操作。尽管如此,here's我过去用来扩展*.foo"c:\temp\*.bar|c:\temp\*.txt"

的一些代码非常简单

另外,除非你在talkies中包装文件名,否则我可能不会用逗号分隔列表,因为逗号在文件名中是有效的。你知道有一天会有人咬你:-) Pipe是一个很好的选择,但只有你把整个表达包装在有声电影中,否则windows会认为你正在做管道。啊,命令行处理的乐趣: - )

答案 1 :(得分:0)

每个参数,如果包含任何空格,必须用引号括起来。否则我会留下引号。

答案 2 :(得分:0)

鉴于你的shell可能支持wild card globbing,最好允许输入文件是一个以空格分隔的列表,并假设如果一个文件名包含空格,那么它将被转义为引号或通过\字符。 简单来说,我的意思是不包含-f或/ f样式开关。

一种稍微不那么常见的技术,但是所有执行命令行解析的库都不支持,是允许多个-f foo.txt -f bar.txt形式的条目。这与命令行通配不兼容(与上述解决方案不同)。

相关问题