【问题标题】:Trying to read in some command line arguments for a console application尝试读取控制台应用程序的一些命令行参数
【发布时间】:2010-11-07 20:51:25
【问题描述】:

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

【问题讨论】:

    标签: .net command-line console-application


    【解决方案1】:

    您正在开发的程序可能有点晚了,但您可以使用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),因此您必须自己完成。不过这很简单,here's 我过去曾使用一些代码来扩展 *.foo"c:\temp\*.bar|c:\temp\*.txt"

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多