1

我有一个非常简单的.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"
4

3 回答 3

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"

你甚至可以放弃整个 files 变量,只将剩余的文件视为文件,然后将其命名为myapp.exe "file 1" "file 2" "file 3"并将文件从额外列表中提取出来。

Mono.Options 非常强大。您甚至不必使用 --,看来您可以使用/file=-file=

不幸的是,Windows 不会为您执行 globbing(除非您将选项传递给 powershell cmdlet),因此您必须自己完成。不过这很简单,这是我过去用来扩展*.foo或扩展的一些代码"c:\temp\*.bar|c:\temp\*.txt"

此外,除非您将文件名包含在对讲机中,否则我可能不会用逗号分隔列表,因为逗号在文件名中有效。您知道有一天会咬您一口 :-) Pipe 是一个不错的选择,但前提是您将整个表达式包裹在对讲机中,否则 windows 会认为您在做管道。啊,命令行处理的乐趣:-)

于 2010-02-28T06:22:09.443 回答
0

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

于 2009-07-03T07:26:38.537 回答
0

鉴于您的外壳可能支持通配符通配符,最好允许输入文件是纯空格分隔的列表,并假设如果文件名包含空格,则它已经通过引号或通过 \ 字符进行转义. 简单地说,我的意思是不包含 --f 或 /f 样式开关。

一种不太常见的技术,但不受所有执行命令行解析的库的支持,是允许表单的多个条目-f foo.txt -f bar.txt。这不适用于命令行 globbing(与上述解决方案不同)。

于 2009-07-03T07:41:17.513 回答