试图在一些命令行参数来读取一个控制台应用程序
-
21-08-2019 - |
题
我有一个非常简单的.NET控制台应用程序。我想通过一些命令行参数...没有强硬那里。
现在,踢球者是,我通常有我希望通过在,对于一个参数的数据项的列表。在这种情况下,文件的列表。我不知道要做到这一点的最好办法。
eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt
但对于文件名包含空格?我应该逗号delimate它?
做有趣的事情,我有其他指定参数时,它接受单值..所以我不知道我是否应该把所有的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"
解决方案
可能有点晚了您正在使用的,但这里的程序,你可以用如何做到这一点 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命令),所以你必须自己做。这是很容易做的,这里的一段代码我已经在过去用于扩大*.foo
或"c:\temp\*.bar|c:\temp\*.txt"
另外,除非你包文件名的对讲机,我可能不会逗号分隔的列表,如逗号是在文件名中有效。你知道,一个人要咬你一天:-)管使一个不错的选择,但只有当你在包装对讲机整个表达式,否则Windows认为你正在做的管道。啊,命令行处理的乐趣: - )
其他提示
每个参数,如果它包含任何空格必须括在引号中。否则,我会离开的报价出来的。
由于你的shell可能支持通配符通配符最好是允许输入文件是一个普通的空格分隔列表,并假设,如果一个文件名中包含它已经被用引号或通过\字符转义周围要么空间。 用平我的意思是不含有--F或/ F式开关。
一个不太常用的技术,但也通过执行命令行解析所有库的支持,是允许形式-f foo.txt -f bar.txt
的多个条目。这不与命令行通配符(不同于上述溶液)打好。