尝试设置一个简单的构建脚本,该脚本将根据其他环境变量扩展路径。这个小脚本运行正常:
echo off
call c:\vstudio\vc\bin\vcvars32.bat
set _ISGIT=1
echo current path is %PATH%
if defined _ISGIT set PATH=c:\git\bin;%PATH%
但是如果我想根据_ISGIT变量的存在执行多行,那么我认为这样可行
echo off
call c:\vstudio\vc\bin\vcvars32.bat
set _ISGIT=1
echo current path is %PATH%
if defined _ISGIT (
set PATH=c:\git\bin;%PATH%
set PATH=c:\foo;%PATH%
)
但是这产生了以下输出:
D:\>test.cmd
D:\>echo off
current path is C:\vstudio\Common7\IDE\CommonExtensions\Microsoft\TestWindow;C:\Program Files (x86)\MSBuild\14.0\bin;C:\
vstudio\Common7\IDE\;C:\vstudio\VC\BIN;C:\vstudio\Common7\Tools;C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319;C:\vstudio
\VC\VCPackages;C:\Program Files (x86)\HTML Help Workshop;C:\vstudio\Team Tools\Performance Tools;C:\Program Files (x86)\
Windows Kits\10\bin\x86;C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\;C:\ProgramData\Oracl
e\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\U
sers\jselbie\.dnx\bin;C:\Program Files\Microsoft DNX\Dnvm\;C:\Program Files (x86)\Windows Kits\10\Windows Performance To
olkit\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\nodejs\;C:\Program Files (x86)\Skype\Phone\;C:\WINDOWS\s
ystem32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Co
rporation\PhysX\Common;C:\Users\jselbie\.dnx\bin;C:\Users\jselbie\AppData\Roaming\npm;%USERPROFILE%\AppData\Local\Micros
oft\WindowsApps;
MSBuild\14.0\bin was unexpected at this time.
MSBuild\14.0\bin was unexpected
可能是包含带空格的目录的原始路径的副作用。带有()
的扩展命令中存在空格似乎会使脚本失效。
如何在不必拥有独立if defined
语句的情况下解决此问题?
答案 0 :(得分:3)
有两件事是错的。首先,路径中的一个目录包含括号。在解析之前执行变量扩展,因此来自PATH的右括号被视为IF块的右括号。要解决此问题,您需要将作业放在引号中:set "PATH=..."
。
其次,在块内(用括号表示),首先扩展整个块中的所有环境变量。然后解析该块。这意味着第二行中的扩展路径与第一行中的扩展路径相同。它不会被第一行改变。要解决此问题,您应该在一行中完全更改路径:
if defined _ISGIT (
set "PATH=c:\foo;c:\git\bin;%PATH%"
)
或使用延迟扩展:
setlocal enabledelayedexpansion
if defined _ISGIT (
set "PATH=c:\git\bin;!PATH!"
set "PATH=c:\foo;!PATH!"
)
Delayed expansion通过在稍后阶段扩展变量,即在第一行分配变量之后起作用。必须先使用setlocal
命令启用它,然后才能使用它。
答案 1 :(得分:1)
set "PATH=c:\git\bin;%PATH%"
set "PATH=c:\foo;%PATH%"
使用引号会使cmd
将引用字符串解释为单个标记,因此它不会在变量[即路径]中看到)
正在关闭if defined ... (
答案 2 :(得分:1)
对近乎详尽的Klitos Kyriacou's answer的贡献。
因此,您的test.cmd
应如下(阅读ENDLOCAL):
@echo off
call c:\vstudio\vc\bin\vcvars32.bat
set _ISGIT=1
echo current path is %PATH%
setlocal enabledelayedexpansion
if defined _ISGIT (
set "PATH=c:\git\bin;!PATH!"
set "PATH=c:\foo;!PATH!"
)
endlocal&(
set "PATH=%PATH%"
)
或如下(阅读CALL,注意加倍百分号):
@echo off
call c:\vstudio\vc\bin\vcvars32.bat
set _ISGIT=1
echo current path is %PATH%
if defined _ISGIT (
call set "PATH=c:\git\bin;%%PATH%%"
call set "PATH=c:\foo;%%PATH%%"
)