gpt4 book ai didi

Windows 命令外壳 : if-then-else weirdness for block statements

转载 作者:可可西里 更新时间:2023-11-01 11:11:41 25 4
gpt4 key购买 nike

尝试设置一个简单的构建脚本,该脚本将根据其他环境变量扩展路径。这个小脚本运行良好:

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 出乎意料 可能是原始路径包含带空格的目录的副作用。带有 () 的扩展命令中存在空格似乎会导致脚本失效。

如何在不必有独立的 if defined 语句的情况下解决这个问题?

最佳答案

有两点不对。首先,路径中的一个目录包含括号。变量扩展在解析之前执行,因此 PATH 的右括号被用作 IF block 的右括号。要解决此问题,您需要将您的分配放在引号中:set "PATH=..."

其次,在一个 block 内(用括号表示)整个 block 中的所有环境变量首先一次展开。然后解析该 block 。这意味着第二行中的扩展路径与第一行中的相同。它不会被第一行改变。要解决此问题,您应该在一行中完全更改路径:

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 命令启用它。

关于Windows 命令外壳 : if-then-else weirdness for block statements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42360991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com