命令行参数,带空格的路径,解析不正确

时间:2014-12-08 22:27:56

标签: c# command-line-arguments

我的问题几乎与此处列出的问题完全相同(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();
}

3 个答案:

答案 0 :(得分:2)

它是由第一个参数末尾的\"引起的。

如果删除尾部斜杠或在引号前添加额外的斜杠,则会得到两个参数。报价被转义并被认为是第一个参数的一部分,直到它在下一个引号后出现2个字符。之后,您不再在引号内,因此每个空格都会在args数组中添加另一个参数。

这是因为.Net使用CommandLineToArgvW来处理命令行参数以及它用来处理字符转义的规则。

Jon Galloway在此

上有一个writeup

引用:

  

CommandLineToArgvW对反斜杠字符有一个特殊的解释,当后面跟一个引号字符(“),   如下:

     
      
  • 2n反斜杠后跟一个引号会产生n个反斜杠后跟一个引号。
  •   
  • (2n)+ 1个反斜杠后跟一个引号再次产生n个反斜杠,后跟一个引号。
  •   
  • n反斜杠后面没有引号只会产生n个反斜杠。
  •   

答案 1 :(得分:0)

这是因为你在这里斜线Working\",当你添加另一个斜杠时,我相信它正常工作  所以吧<snip>...Working\\"

编辑:我只是自己测试了一下,使用双\\你得到3项:)

enter image description here

另见http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx

答案 2 :(得分:0)

试试这个,再次将args加入一个字符串,然后在双引号字符上拆分该字符串。

string parms = String.Join(" ", args);
string[] arguments = parms.Split('\"');
...
BTW:这是John Koerner解释的问题的解决方法。