Batch file 有条件地将目录前置到路径失败,因为C:\Program Files(x86)已在路径中

Batch file 有条件地将目录前置到路径失败,因为C:\Program Files(x86)已在路径中,batch-file,cmd,scripting,Batch File,Cmd,Scripting,Windows 10 cmd脚本问题 尝试有条件地更新.cmd脚本中的my PATH环境变量。我想根据另一个环境变量的存在,在路径中预先添加一些内容。如果未设置环境变量,则不应向路径添加任何内容。如果已设置,请在其前面加上前缀 这是我的最小可复制示例。将以下内容保存到磁盘上的script.cmd文件中: echo off REM Simulate a user with a PATH that has C:\program files (x86) within it PATH c:\progra

Windows 10 cmd脚本问题

尝试有条件地更新.cmd脚本中的my PATH环境变量。我想根据另一个环境变量的存在,在
路径
中预先添加一些内容。如果未设置环境变量,则不应向路径添加任何内容。如果已设置,请在其前面加上前缀

这是我的最小可复制示例。将以下内容保存到磁盘上的
script.cmd
文件中:

echo off
REM Simulate a user with a PATH that has C:\program files (x86) within it
PATH c:\program files (x86)\my company app;%PATH%

set _PERL_PATH=D:\projects\strawberry\perl\bin
set _NASM_PATH=D:\projects\nasm

if NOT "%_PERL_PATH%"=="" (PATH %_PERL_PATH%;%PATH%)
if NOT "%_NASM_PATH%"=="" (PATH %_NASM_PATH%;%PATH%)
if NOT "%_GIT_PATH%"=="" (PATH %_GIT_PATH%;%PATH%)
然后从命令行执行
script.cmd
文件来运行它

D:\script.cmd
结果:

D:\>echo off
\my was unexpected at this time.
以上都是一个模拟的例子。即使我没有明确地将
C:\program files(x86)\my company app
添加到PATH中,在此脚本之前运行的其他脚本也会执行类似的操作(即:Visual Studio的vcvars32.bat)

我认为这与空格和缺少引号有关。但是经过一些实验,它与初始路径中的
(x86)\
序列有关


如何修复?

如果正文:

if NOT "%_PERL_PATH%"=="" PATH %_PERL_PATH%;%PATH%
if NOT "%_NASM_PATH%"=="" PATH %_NASM_PATH%;%PATH%
if NOT "%_GIT_PATH%"=="" PATH %_GIT_PATH%;%PATH%
正如@Squashman和@Mofi所指出的,如果任何路径字符串包含以下任何符号,上述代码仍可能遇到问题:

&()[]{}^=;!'+,`~
因为它们是脚本运算符,可能会混淆解释器。避免这些问题的最佳方法是在可能包含以下内容之一的内容周围加引号:

set "path=c:\program files (x86)\my company app;%PATH%"
因此,您可以在
if
语句中安全地使用块参数,即使您实际上并不需要它们:

if NOT "%_PERL_PATH%"=="" (set "PATH=%_PERL_PATH%;%PATH%")
if NOT "%_NASM_PATH%"=="" (set "PATH=%_NASM_PATH%;%PATH%")
if NOT "%_GIT_PATH%"=="" (set "PATH=%_GIT_PATH%;%PATH%")
现在,嵌入的参数在一个带引号的字符串中,因此它们不会让解释器误认为您有多个脚本块。

@ECHO OFF
SETLOCAL
set\u PERL\u PATH=D:\projects\草莓\PERL\bin
set\u NASM\u PATH=D:\projects\NASM
设置“modifiedpath=%\u GIT\u path%;%\u NASM\u path%;%\u PERL\u path%;c:\program files(x86)\my company app;%path%”
:lopsemis
如果“%modifiedpath:~0,1%”eq“;“设置”modifiedpath=%modifiedpath:~1%”转到lopsemis(&G)
如果“%modifiedpath%”neq“%modifiedpath:;;=;%”设置“modifiedpath=%modifiedpath:;;=;%”&转到lopsemis
回显%路径%
回显%modifiedpath%
::方法2
设置“modifiedpath=c:\program files(x86)\my company app;%PATH%”
如果已定义_PERL_PATH SET“modifiedpath=%_PERL_PATH%;%modifiedpath%”
如果定义了_nasm_路径集“modifiedpath=%_nasm_路径%;%modifiedpath%”
如果已定义_git_PATH SET“modifiedpath=%_git_PATH%;%modifiedpath%”
回显%路径%
回显%modifiedpath%
后藤:EOF

还是我遗漏了一些基本的东西?

设置“path=c:\program files(x86)\my company app;%path%”
我强烈建议使用Squashman在上述评论中建议的语法。环境变量
path
值中的文件夹路径也可以包含
&
,并且只有语法
设置“path=%ProgramFiles(x86)%\my company app;%path%”
确保将与符号解释为文字字符,而不是解释为与运算符。与本例中的命令集相比,命令路径并非真正有用。