首页 > 解决方案 > 为什么 cmd.exe 以不同方式解析插入符号

问题描述

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

谢谢!

标签: windowscmdcommand-linecommand-line-arguments

解决方案


程序参数有很多问题。

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

首先,该行由 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 程序的后果是:
一团糟!

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

更多解释Windows 命令解释器 (CMD.EXE) 如何解析脚本?


推荐阅读