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

.net 正在尝试读入控制台应用程序的一些命令行参数,.net,command-line,console-application,.net,Command Line,Console Application,我有一个非常简单的.NET控制台应用程序。我想传入一些命令行参数。。。没什么难事 现在,最重要的是,我通常有一个我想传递的项目列表,比如一个参数。在本例中,是一个文件列表。我不知道最好的方法是什么 eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt 但是带空格的文件名呢?我应该把它弄熟吗 为了让事情变得有趣,我还有其他参数,它们接受单个值。。所以我不确定是否应该把所有的arg数据都用双引号引起来 eg. myapp.exe files=aaa.txt,bb

我有一个非常简单的.NET控制台应用程序。我想传入一些命令行参数。。。没什么难事

现在,最重要的是,我通常有一个我想传递的项目列表,比如一个参数。在本例中,是一个文件列表。我不知道最好的方法是什么

eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt 
但是带空格的文件名呢?我应该把它弄熟吗

为了让事情变得有趣,我还有其他参数,它们接受单个值。。所以我不确定是否应该把所有的arg数据都用双引号引起来

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


如果每个参数包含空格,则必须用引号括起来。否则,我将不使用引号。

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


一种稍不常见但也不受所有执行命令行解析的库支持的技术是允许多个形式为
-f foo.txt-f bar.txt
的条目。这与命令行globbing(与上面的解决方案不同)不太合适。

对于您正在开发的程序来说可能有点晚了,但下面介绍如何使用

static void Main(字符串[]args)
{
//让我们试试这个单声道选项,好吗?
字符串xapfile=null;
var files=新列表();
var p=new Mono.Options.OptionSet()
{
{“xap=,v=>xapfile=v},
{“file:,v=>files.Add(v)}
};
List extra=p.Parse(args);
Console.WriteLine(@)
xap='{0}',
文件={1}“,
沙普菲尔,
string.Join(“,”,files.ToArray())
);
Console.WriteLine(@)
剩余:{0}“,
Join(Environment.NewLine,extra.ToArray())
);
//剩下的主要工作在这里
调用语法将是

myapp.exe--file=“file 1”--file=“file 2”--file=“file 3”

您甚至可以放弃整个files变量,只将剩余的文件视为文件,将其称为
myapp.exe“file 1”“file 2”“file 3”
,并从额外列表中删除这些文件

选项非常强大。您甚至不必使用--,似乎可以使用
/file=
-file=

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

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

eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello"
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