为什么 cmd.exe 以不同方式解析插入符

Why cmd.exe parses caret differently

我有以下命令和一个输出接收到的参数的简单程序。 第一个命令行 printer.exe arg1 \" ^" arg2 拆分为 printer.exearg1"^ arg2,第二个 printer.exe arg1 ^"arg2 拆分为 printer.exearg1arg2。我的问题是,为什么在第二个命令中跳过插入符号 ^

谢谢!

程序参数有很多问题。

要理解它们,您需要知道该行是如何解析的。

首先该行被cmd.exe解析。
有很多规则(和阶段),但在你的情况下只有两个相关。

  1. 每个引号都会切换 quoted-mode,在引号模式下,特殊字符会失去其 special 的含义

  2. 插入符号转义下一个字符,插入符号本身将被删除。
    插入符号也可以转义引号,以避免激活引号模式。
    这仅适用于未引用模式,引号内的插入符号失去其特殊含义。

反斜杠对 cmd.exe 没有特殊意义。

对于您的示例,cmd.exe 会将它们解析为:

printer.exe arg1 \" ^" arg2
-> printer.exe arg1 \" ^" arg2     --- The caret is inside quotes

printer.exe arg1 ^"arg2
-> printer.exe arg1 "arg2          --- The caret was outside quotes

在 windows 上,每个 program.exe 负责将命令行拆分为参数,尽管 linux,其中 shell 决定如何拆分参数。

windows 程序的结果是:
一团糟!

您需要了解每个程序的规则,了解行如何拆分为参数。
有些程序的规则支持反斜杠或双引号,有些程序带有单引号,有些则不能构建任意参数。

更多解释How does the Windows Command Interpreter (CMD.EXE) parse scripts?