为什么后面的反斜杠后面加上引号在cmd中performance得如此奇怪?

有了这个程序( cs.exe ):

 class Program { static void Main(string[] args) { foreach (var item in args) { Console.WriteLine(item); } } } 

并运行:

 > cs.exe go\to\a_path go\to\a_path > cs.exe "go\to\a path" go\to\a path > cs.exe "go\to\a path\" go\to\a path" > cs.exe 'go\to\a path\' 'go\to\a path\' 

这意味着如果你的path有一个空格,所以你引用它,要非常小心,不要把尾部放在尾,否则你的程序可能无法处理它,因为它不正确地包含"在最后。甚至怪异!

PowerShellperformance出类似的行为,但没有单引号和双引号之间的差异。

我如何理解这种行为? 在cmd中评估反斜杠的基本规则是什么,所以这个可以一致地解释?

Solutions Collecting From Web of "为什么后面的反斜杠后面加上引号在cmd中performance得如此奇怪?"

由于不是调用内部cmd命令,而是调用可执行文件,因此此行为不是由cmd引起的,而是由命令行参数解析器例程引起的。 在Windows中,程序不会收到一个集合/数组/参数集合,而是一个包含所有参数的字符串,每个程序都标记这个字符串来获取每个元素。 这通常是由编译器包含的例程完成的,该例程隐藏了这个操作,并暴露给代码处理参数的一个更简单的方法。

C命令行参数解析器的文档声明

  • 参数是由空格分隔的,空格是一个空格或一个制表符。

  • 由双引号包围的字符串被解释为单个参数,而不管其中包含的空白。 带引号的字符串可以嵌入到参数中。 请注意,脱字符( ^ )不被识别为转义字符或分隔符。

  • 双引号前加一个反斜杠\" ,被解释为文字双引号( " )。

  • 反斜杠从字面上解释,除非它们立即在双引号之前。

  • 如果偶数个反斜杠后面跟着一个双引号,则对于每对反斜杠( \\ ),将一个反斜杠( \ )放在argv数组中,双引号( " )被解释为字符串分隔符。

  • 如果反斜杠的奇数后跟一个双引号,则对于每对反斜杠( \\ ),将一个反斜杠( \ )放在argv数组中,双引号将被解释为转义序列,其余的反斜杠,导致一个文字双引号( " )被放置在argv。

还有一套无证的/非官方的规则( 如何解析命令行参数 )

  • 在双引号块之外"开始一个双引号块。
  • 在一个双引号块中, "后跟一个不同的字符(不是另一个" )结束双引号块。
  • 在一个双引号块中, "紧随其后" (即"" )导致单个"被添加到输出,并且双引号块继续。

.Net参数解析规则只是这些规则的推导。 如果您需要不同的行为,那么您应该使用Environment.CommandLine属性来检索完整的命令行字符串并编写您自己的解析代码。