Windows 为什么cmd.exe解析插入符号的方式不同

Windows 为什么cmd.exe解析插入符号的方式不同,windows,cmd,command-line,command-line-arguments,Windows,Cmd,Command Line,Command Line Arguments,我有以下命令和一个输出接收到的参数的简单程序。 第一个命令行printer.exe arg1\“^”arg2分为printer.exe、arg1、和^arg2,第二个命令行printer.exe arg1^”arg2分为printer.exe、arg1和arg2。我的问题是,为什么在第二个命令中跳过插入符号^ 谢谢 程序参数有很多问题 要理解它们,您需要知道如何解析该行 首先,该行由cmd.exe解析。 有很多规则(和阶段),但在您的案例中只有两个相关的规则 每个引号都会切换引号模式,在引号模式

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


谢谢

程序参数有很多问题

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

首先,该行由cmd.exe解析。
有很多规则(和阶段),但在您的案例中只有两个相关的规则

  • 每个引号都会切换
    引号模式
    ,在引号模式下,特殊字符将失去其
    特殊
    含义

  • 插入符号转义下一个字符,插入符号本身将被删除。
    插入符号也可以转义引号,以避免激活引号模式。
    这只适用于无引号模式,在引号内插入符号失去其特殊意义

  • 反斜杠对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程序的结果是:
    一团糟

    您需要知道每个程序的规则,知道如何将行拆分为参数。
    有些程序有支持反斜杠或双引号的规则,有些程序有单引号,有些程序没有生成任意参数的能力


    关于更多的解释,这在很大程度上取决于
    printer.exe
    如何解析其参数。您是否在Windows命令提示符窗口(
    cmd.exe
    )中执行此操作?是的,
    printer.exe
    cmd.exe
    中执行,参数由CRT解析,我只打印它们。对于
    cmd.exe
    而言,
    \
    并不意味着任何特殊,只有
    ^
    是转义字符;引用会禁用特殊字符识别,从而导致转义;因此,从左到右阅读,第一个示例的结果是
    printer.exe arg1\“^”arg2
    (未更改),第二个示例的结果是
    printer.exe arg1”arg2
    (您跳过了引文her);现在它取决于
    printer.exe
    如何处理这些命令行……在第一种情况下,应该切换
    quoted模式的插入符号由“`”转义,那么为什么插入符号被认为是引号内的呢?@tairqammar在第一种情况下是第一个引号(带反斜杠的一个)激活引号模式,因此插入符号失去任何特殊意义,第二个引号再次禁用引号模式。反斜杠不会转义
    cmd
    解析器中的任何内容(在将行转发到应用程序之前处理该行)。它“只是一个普通字符”(但应用程序可以对其进行不同的处理)