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
解析器中的任何内容(在将行转发到应用程序之前处理该行)。它“只是一个普通字符”(但应用程序可以对其进行不同的处理)