当文件夹名称包含“&”字符时,以管理员身份运行批处理文件会失败。

3
为了重现问题,请在一个包含"&"的目录中创建一个简单的批处理文件。
例如,在目录"C:\temp\Jack & Dianne"中创建run.bat:
@ECHO OFF
ECHO Hello
PAUSE

在Windows资源管理器中,右键单击并选择“以管理员身份运行”。批处理文件似乎无法正常运行。例如:在我点击Windows的“用户帐户控制”对话框上的“是”后,一个命令提示符窗口似乎会一闪而过,然后消失。
如果我重命名目录以删除“&”,那么批处理文件将正常运行。我可以在Windows 10中重现此问题,但认为这可能是一个普遍的Windows问题。
有人能够解决这个问题吗?

2
如果使用批处理的其他功能,会导致问题。我使用 + 而不是 & - Noodles
不确定,但也许 /S 选项可以帮助定义 runas 动词:%SystemRoot%\System32\cmd.exe /S /C "%1" %* - aschipfl
@eryksun,是的,你说得对,我没有确切的规则在脑海中,对于造成的混淆我很抱歉... - aschipfl
1个回答

3
标准的“.bat”和“.cmd”文件“打开”命令使用“%1”%*”作为模板命令。(此命令在相对子键“shell \ open \ command”下,由“batfile”和“cmdfile” progids在“HKLM \ Software \ Classes”中定义。)该模板命令不包括shell可执行文件,只包括目标脚本(“%1”)和参数(“*%”)。构建执行“%ComSpec%”shell的最终命令行留给“CreateProcess[AsUser]W”调用,它还添加了适当的引号。
实现“runas”动词的方式需要在模板命令中设置可执行文件,因此他们明确将其设置为“%SystemRoot%\ System32 \ cmd.exe / C” %1“%*”。这忘了引用整个命令行。更改为以下内容:
`%SystemRoot%\System32\cmd.exe /C ""%1" %*"`. 

为了理解为什么需要额外引用,可以阅读cmd /?帮助中关于/C选项的说明。简而言之,如果命令行满足以下条件:没有/S选项,并且恰好有两个引号,这些引号将包围一个包含一个或多个空格字符和没有特殊字符 (&<>()@^|) 的字符串,且是可执行文件的名称,则/C选项只会在%1脚本路径周围保留引号。
由于路径中存在&字符,CMD会采用常规行为来剥离第一个引号和最后一个引号。如果没有拖放任何内容到图标上 (即没有%*),那么这将是包围%1脚本路径的引号。通过整个命令行加引号,CMD只会删除额外的引号,而不是实际上可能需要的引号来转义脚本路径或参数中的空格和特殊字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接