为什么在cmd中尾随反斜杠后跟引号表现得如此奇怪?

时间:2017-01-12 07:04:57

标签: windows cmd

使用此程序(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\'

这意味着如果你的路径有一个空格所以你引用它,要非常小心不要在结尾放置一个尾随的\,否则你的程序 可能只是无法处理它,因为它最后错误地包含"。单引号甚至更奇怪!

PowerShell表现出类似的行为,但没有单引号和双引号之间的区别。

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

1 个答案:

答案 0 :(得分:4)

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

<{3}}状态的文档

  
      
  • 参数由空格分隔,可以是空格或制表符。

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

  •   
  • 以反斜杠\"开头的双引号被解释为文字双引号(")。

  •   
  • 反斜杠按字面解释,除非它们紧跟在双引号之前。

  •   
  • 如果偶数个反斜杠后面跟一个双引号,那么每个argv数组中会放一个反斜杠(\)   一对反斜杠(\\)和双引号(")是   解释为字符串分隔符。

  •   
  • 如果奇数个反斜杠后面跟一个双引号,那么每个argv数组中会放一个反斜杠(\)   一对反斜杠(\\)和双引号被解释   作为剩余反斜杠的转义序列,导致文字   双引号(")放在argv中。

  •   

还有一套无证件/非官方规则(C Command-Line argument parser

  
      
  • 在双引号块之外,"启动双引号块。
  •   
  • 在双引号块中,"后跟另一个字符(而非另一个")结束双引号块。
  •   
  • 在双引号块中,"紧跟另一个"(即"")会导致单个"添加到输出中,并且   双引号块继续。
  •   

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