我有一个非常简单的.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"
答案 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
形式的条目。这与命令行通配不兼容(与上述解决方案不同)。