Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 当目录有“0”时,以管理员身份运行批处理文件失败&&引用;性格_Windows_Batch File - Fatal编程技术网

Windows 当目录有“0”时,以管理员身份运行批处理文件失败&&引用;性格

Windows 当目录有“0”时,以管理员身份运行批处理文件失败&&引用;性格,windows,batch-file,Windows,Batch File,若要重现此问题,请在包含“&”的目录中创建一个简单的批处理文件 e、 g.在目录中:“C:\temp\Jack&Dianne”, 创建run.bat: @ECHO OFF ECHO Hello PAUSE 在Windows资源管理器中,单击鼠标右键,然后单击“以管理员身份运行”。批处理文件似乎运行不正常。i、 e:当我在Windows的“用户帐户控制”对话框中单击“是”后,一个命令提示窗口似乎会闪烁一瞬间,然后消失 如果我重命名目录以删除“&”,则批处理文件运行正常。我可以在Windows 1

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

e、 g.在目录中:“C:\temp\Jack&Dianne”, 创建run.bat:

@ECHO OFF
ECHO Hello
PAUSE
在Windows资源管理器中,单击鼠标右键,然后单击“以管理员身份运行”。批处理文件似乎运行不正常。i、 e:当我在Windows的“用户帐户控制”对话框中单击“是”后,一个命令提示窗口似乎会闪烁一瞬间,然后消失

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

有人能解释一下吗?

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

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

`%SystemRoot%\System32\cmd.exe /C ""%1" %*"`. 
要了解为什么需要额外报价,请阅读
/C
选项的
cmd/?
帮助。总之,
/C
选项仅当命令行满足以下条件时,才会在
%1
脚本路径周围保留引号:无
/S
选项,且正好有两个引号用于分隔包含一个或多个空白字符和无特殊字符的字符串(
&()@^
)和是可执行文件的名称


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

如果使用批处理的其他功能,则会导致问题。我使用
+
而不是
&
。不确定,但
/S
选项可能有助于定义
运行方式
动词:
%SystemRoot%\System32\cmd.exe/S/C“%1”%*
@eryksun,是的,你是对的,我没有记住确切的规则,抱歉混淆了。。。