我看到插入符号是记录的转义字符。
但是,我有一个例子表明,对于双引号字符,^
不起作用,你必须使用\
C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""
为什么会这样?在哪里有记载?
答案1
中的一个例子RUNAS /?
展示了该语法。插入符号是转义字符,CMD.EXE
但在 Windows 中,各个程序可以自由实现自己的转义字符和通配符。
答案2
在 cmd 中\
,不是escape "
。这里有一个快速的证明和解释:
运行
echo "" & echo 1
. (&
是cmd中的特殊字符,left & right
表示先运行left
再运行right
.)我们可以看到和都echo ""
运行echo 1
成功了。接下来运行
echo " & 1234
。我们可以看到输出是" & 1234
。这是因为开头"
尚未关闭,因此其后的所有内容(包括特殊字符 )都被解释为字符串&
。跑步
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
正确。