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

bar*_*lop 11 windows shell cmd.exe

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

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

C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""
Run Code Online (Sandbox Code Playgroud)

为什么会这样,它在哪里记录?

Pac*_*ier 17

在cmd中,\没有逃跑"。这是一个快速的证明和解释:

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

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

  3. 运行echo "\" & 1234

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

    • 如果\未能逃脱下面"下面"将关闭字符串,& 1234被解释为字符串的一部分。

    在输出中,我们没有看到& 1234解释为字符串的一部分。这证明,\已经逃不掉了"

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

的确,我们怎样才能让事情像echo """ & echo 1工作一样简单?

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

怎么样的"字符本身呢?...不, echo """" & echo 1 输出"""",而不是"""

事实是,在参数传递的引号内没有任何东西可以逃脱"。您可以为此苦恼数年,却找不到任何解决方案。这只是 cmd 脚本的一些固有限制。

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

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


Den*_*son 6

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