在 cmd.exe 中使用反斜杠转义字符(以 runas 命令为例)

在 cmd.exe 中使用反斜杠转义字符(以 runas 命令为例)

我看到插入符号是记录的转义字符。

但是,我有一个例子表明,对于双引号字符,^不起作用,你必须使用\

C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""

为什么会这样?在哪里有记载?

答案1

中的一个例子RUNAS /?展示了该语法。插入符号是转义字符,CMD.EXE但在 Windows 中,各个程序可以自由实现自己的转义字符和通配符。

答案2

在 cmd 中\不是escape "。这里有一个快速的证明和解释:

  1. 运行echo "" & echo 1. (&是cmd中的特殊字符,left & right表示先运行left再运行right.)我们可以看到和都echo ""运行echo 1成功了。

  2. 接下来运行echo " & 1234。我们可以看到输出是" & 1234。这是因为开头"尚未关闭,因此其后的所有内容(包括特殊字符 )都被解释为字符串&

  3. 跑步echo "\" & 1234

    • 如果\确实转义了以下内容",则开头"将不会被关闭,并且字符& 1234将被解释为字符串的一部分。

    • 如果\无法逃脱以下情况"以下"将关闭字符串,& 1234并将不是被解释为字符串的一部分。

    在输出中,我们没有看到& 1234解释为字符串的一部分。这就证明,\逃跑失败了"

那么"在参数传递时引号内的转义是什么呢?虽然^在引号外也可以工作(通过 很容易证明echo ^" & echo 1),但它不能在引号内转义引号。

确实,我们如何才能让如此简单的事情echo """ & echo 1发挥作用呢?

char ^? ...不,echo "^"" & echo 1输出"^"",而不是"""

char 本身怎么样"?...不, echo """" & echo 1 输出"""",而不是"""

事实上,没有任何内容可以"在引号内逃脱以传递参数。你可能为此苦思冥想了好几年,却找不到解决办法。这只是 cmd 脚本的一些固有限制。

然而,好消息是,你很可能绝不遇到需要这样做的情况。当然,没有办法开始echo """ & echo 1工作,但这不是什么大问题,因为这只是您可能永远不会遇到的人为问题。

例如,考虑runas。它可以正常工作,而无需"在引号内转义,因为runas知道没有办法做到这一点,并进行了内部调整以解决这个问题。runas发明了自己的解析规则(runas /flag "anything even including quotes")并且不以通常的方式解释 cmd 参数。这些特殊语法的官方文档非常稀少(或不存在)。除了/?和之外help,它主要是反复试验。

答案3

\符号使解释者将下一个符号解释为特点而不是标识符

你在代码中也经常会看到它:

"Hello \"World\""

这是解释作为

Hello "World"

在您的示例中,为了将参数传递给cmd,需要将其括在“”中。但是,由于 的参数cmd包含“(这将结束封闭),因此它们被附加在 中\。如果没有“”, 将/k dir \"%userprofile%\"被解释为 的参数runas,而不是 的参数cmd

他们之所以将 %userprofile% 括起来是因为这是一个环境变量,将被包含空格的文本替换,这(出于与上述相同的原因)会导致参数不cmd正确。

相关内容