我的问题几乎与此处列出的问题完全相同(Console app not parsing correctly args with white spaces),但答案与我的情况无关。
我接收到我的简单程序的参数,这些参数是路径和路径+文件名,其中可能包含大量空格。发生的事情是路径中的空间产生的参数比我实际产生的要多得多。我通过args数组手动重建了我需要的东西,但是今天我发现如果文件名有两个空格我的方法不会工作,我不知道在程序中修复它。
上传" \ heeterfilesrv \ Data \ Guardian Storage \ 99999_Test4 \ Working \" " \ heeterfilesrv \ Data \ Guardian Storage \ 99999_Test4 \ Working \ 99999_Test4-GUAST - 买家列表PA 11 15 14_112514_101753 AM_Sht =和stuff_Automation \ 99999_Test4-GUAST - 买家列表PA 11 15 14_112514_101753 AM_Sht =和stuff_Automation.zip"
所以在那组参数的情况下,我得到一个带有21个元素的args []。鉴于在某一点上有一对空格,我无法纠正这一点。
我能做些什么来确保路径能够顺利通过吗?在给予或接收端是好的,因为我控制两者,但不是路径/文件名本身。
代码:
static void Main(string[] args)
{
//args 0 = Switch value
//args 1 = Working Directory
//args 2 = Mail.dat zip file
if (args.Length == 0)
{
Environment.Exit(-1);
}
string maildatName = args[1].Substring(args[1].IndexOf("Working")+8, args[1].Length - (args[1].IndexOf("Working")+8)) + " ";
for (int x = 2; x < args.Length; x++)
{
maildatName += args[x];
maildatName += " ";
}
args[1] = args[1].Substring(0, args[1].IndexOf("Working") + 7);
maildatName = maildatName.Trim();
}
答案 0 :(得分:2)
它是由第一个参数末尾的\"
引起的。
如果删除尾部斜杠或在引号前添加额外的斜杠,则会得到两个参数。报价被转义并被认为是第一个参数的一部分,直到它在下一个引号后出现2个字符。之后,您不再在引号内,因此每个空格都会在args
数组中添加另一个参数。
这是因为.Net使用CommandLineToArgvW
来处理命令行参数以及它用来处理字符转义的规则。
Jon Galloway在此
上有一个writeup引用:
CommandLineToArgvW对反斜杠字符有一个特殊的解释,当后面跟一个引号字符(“), 如下:
- 2n反斜杠后跟一个引号会产生n个反斜杠后跟一个引号。
- (2n)+ 1个反斜杠后跟一个引号再次产生n个反斜杠,后跟一个引号。
- n反斜杠后面没有引号只会产生n个反斜杠。
答案 1 :(得分:0)
这是因为你在这里斜线Working\"
,当你添加另一个斜杠时,我相信它正常工作
所以吧<snip>...Working\\"
编辑:我只是自己测试了一下,使用双\\
你得到3项:)
答案 2 :(得分:0)
试试这个,再次将args加入一个字符串,然后在双引号字符上拆分该字符串。
string parms = String.Join(" ", args);
string[] arguments = parms.Split('\"');
...
BTW:这是John Koerner解释的问题的解决方法。