[英]running batch file as administrator fails when directory has “&” character
要重现问题,请在包含“&”的目录中创建一个简单的批处理文件。
例如在目录中:“C:\\ temp \\ Jack&Dianne”,创建run.bat:
@ECHO OFF
ECHO Hello
PAUSE
在Windows资源管理器中,右键单击并单击“以管理员身份运行”。 批处理文件似乎无法正常运行。 即:在Windows“用户帐户控制”对话框中单击“是”后,命令提示符窗口似乎瞬间闪烁,然后消失。
如果我重命名目录以删除“&”,则批处理文件运行正常。 我可以在Windows 10中重现该问题,但怀疑它将是一般的Windows问题。
任何人都能解释一下吗?
.bat和.cmd文件的标准“打开”命令使用"%1" %*
作为模板命令。 (此命令由相对子项“shell \\ open \\ command”中的“HKLM \\ Software \\ Classes”下的batfile和cmdfile progids定义。)此模板命令不包括shell可执行文件,只包含目标脚本( "%1"
)和参数( *%
)。 构建执行%ComSpec%
shell的最终命令行由CreateProcess[AsUser]W
调用完成,该调用还会添加正确的引用。
实现“runas”动词的方式需要template命令中的可执行文件,因此它们显式将其设置为%SystemRoot%\\System32\\cmd.exe /C "%1" %*
。 这会忘记引用整个命令行。 将其更改为以下内容:
`%SystemRoot%\System32\cmd.exe /C ""%1" %*"`.
要理解为什么需要额外的引用,请阅读cmd /?
帮助/C
选项。 总之,只有在命令行符合以下条件时, /C
选项才会在%1
脚本路径周围保留引号:no /S
选项和两个引号,用于划分包含一个或多个空白字符且没有特殊字符的字符串( &<>()@^|
)并且是可执行文件的名称。
由于路径中的&
字符,CMD采用剥离引号和最后引号的常规行为。 如果没有在图标上拖放任何内容(即没有%*
),这将是%1
脚本路径周围的引号。 在引用整个命令行的情况下,CMD仅删除额外的引号而不是引号,这些引号可能是为了转义脚本路径或参数中的空格和特殊字符所必需的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.