【问题标题】:running batch file as administrator fails when directory has "&" character当目录具有“&”字符时,以管理员身份运行批处理文件失败
【发布时间】:2019-03-14 02:21:17
【问题描述】:

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

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

@ECHO OFF
ECHO Hello
PAUSE

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

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

谁能解释一下?

【问题讨论】:

  • 如果使用批处理的其他功能会出现问题。我使用+ 而不是&
  • 不确定,但/S 选项可能有助于定义runas 动词:%SystemRoot%\System32\cmd.exe /S /C "%1" %*
  • @eryksun,是的,你是对的,我没有记住确切的规则,很抱歉造成混淆......

标签: windows batch-file


【解决方案1】:

.bat 和 .cmd 文件的标准“打开”命令使用"%1" %* 作为模板命令。 (此命令由相关子项“shell\open\command”中的“HKLM\Software\Classes”下的 batfile 和 cmdfile progids 定义。)此模板命令不包含 shell 可执行文件,仅包含目标脚本 (@987654322 @) 和参数 (*%)。构建执行%ComSpec% shell 的最终命令行留给CreateProcess[AsUser]W 调用,这也添加了正确的引用。

“runas”动词的实现方式需要模板命令中的可执行文件,因此他们明确将其设置为%SystemRoot%\System32\cmd.exe /C "%1" %*。这忘记引用整个命令行。将其更改为以下内容:

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

要了解为什么需要额外引用,请阅读 cmd /? 帮助以了解 /C 选项。总之,仅当命令行满足以下条件时,/C 选项才会在 %1 脚本路径周围保留引号:没有 /S 选项并且恰好有两个引号分隔包含一个或多个空格字符的字符串,并且没有特殊字符 (&<>()@^|) 并且是可执行文件的名称。

由于路径中有& 字符,CMD 采用其常规行为,即去掉前导引号和最后一个引号。如果没有在图标上拖放任何内容(即没有 %*),这将是 %1 脚本路径周围的引号。引用整个命令行后,CMD 仅删除多余的引号,而不是为了转义脚本路径或参数中的空格和特殊字符而可能需要的引号。

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2015-10-15
    • 2012-10-06
    • 2013-05-29
    相关资源
    最近更新 更多