我想从批处理文件中启动一个Windows可执行文件,其中可执行文件的路径存储在一个变量中。
@echo off
set qtpath=C:\Program Files\Qt\5.7\mingw53_32\bin
set execpath=%qtpath%\windeployqt.exe
echo %execpath%
%execpath% --someparams
不幸的是,执行我的脚本会引发错误:
'C:\Program' is not recognized as an internal or external command, operable program or batch file.
看起来不知何故,字符串在Program Files
的空格处终止。
答案 0 :(得分:6)
您应该将代码更改为:
@echo off
set "qtpath=C:\Program Files\Qt\5.7\mingw53_32\bin"
set "execpath=%qtpath%\windeployqt.exe"
echo "%execpath%"
"%execpath%" --someparams
SPACE ,还有 TAB ,,
,;
,=
和非中断空格(ASCII { {1}})在命令提示符0xFF
中构成token separators。要转义标记化,请将您的路径括在cmd
之间。这样可以避免使用^
,(
and )
,&
, <
, >
and |
等特殊字符时出现问题。
""
命令行中的引号再次避免了特殊字符的问题;它们不会成为变量值的一部分,因为它们包含整个赋值表达式。
我建议不将引号包含在变量值(set
)中,因为这样会遇到问题,尤其是在因不需要的(双引号)连接字符串时(对于例如,set VAR="some value"
返回echo "C:\%VAR%\file.txt"
)。
答案 1 :(得分:2)
你是完全正确的。如果要执行的文件的路径包含空格,则必须用引号将其括起来:
@echo off
set qtpath=C:\Program Files\Qt\5.7\mingw53_32\bin
set execpath="%qtpath%\windeployqt.exe"
echo %execpath%
%execpath% --someparams
这应该有用。
当您使用引号括起%execpath%
时,它也会起作用:
"%execpath%" --someparams