当目录具有“&”字符时,以管理员身份运行批处理文件失败

时间:2019-03-14 02:21:17

标签: windows batch-file

要重现问题,请在其中带有“&”的目录中创建一个简单的批处理文件。

例如在目录:“ C:\ temp \ Jack&Dianne”中, 创建run.bat:

@ECHO OFF
ECHO Hello
PAUSE

在Windows资源管理器中,右键单击并单击“以管理员身份运行”。批处理文件似乎无法正常运行。即:在Windows的“用户帐户控制”对话框中单击“是”后,命令提示符窗口似乎会瞬间闪烁,然后消失。

如果我重命名目录以删除“&”,则批处理文件运行正常。我可以在Windows 10中重现该问题,但怀疑这将是Windows的一般问题。

谁能阐明一些想法?

1 个答案:

答案 0 :(得分:2)

.bat和.cmd文件的标准“打开”命令使用"%1" %*作为模板命令。 (此命令由相对子项“ shell \ open \ command”中“ HKLM \ Software \ Classes”下的batfile和cmdfile程序定义。)此模板命令不包括Shell可执行文件,仅包括目标脚本({{ 1}}和参数("%1")。构建执行*% shell的最终命令行由%ComSpec%调用决定,这也会添加正确的引用。

“ runas”动词的实现方式需要模板命令中的可执行文件,因此他们将其显式设置为CreateProcess[AsUser]W。这忘了引用整个命令行。将其更改为以下内容:

%SystemRoot%\System32\cmd.exe /C "%1" %*

要了解为什么需要额外的报价,请阅读`%SystemRoot%\System32\cmd.exe /C ""%1" %*"`. 选项的cmd /?帮助。总之,仅当命令行满足以下条件时,/C选项才会将引号引起来/C:否%1选项和恰好两个引号来分隔包含一个字符串的字符串或更多空白字符,没有特殊字符(/S),并且是可执行文件的名称。

由于路径中的&<>()@^|字符,CMD采取了常规行为,即删除了引号和最后一个引号。如果没有在图标上拖放任何内容(即没有&),则这将是%*脚本路径周围的引号。在整个命令行加上引号的情况下,CMD仅删除多余的引号,而不是为避免在脚本路径或参数中转义空格和特殊字符而必需的引号。