我想通过运行
来确定执行批处理文件(vcvarsall.bat)后PATH环境变量是什么cmd /c "vcvarsall.bat x86_amd64 && echo %PATH%"
但是发生的事情并不是我所期待的。例如,如果我运行:
cmd /c "set PATH=test && echo %PATH%"
我只是获得主机进程的PATH,而不是我预期的“测试”,因为echo%PATH%应该在子进程的上下文中运行,而不是父进程。那么,为什么会发生这种情况,我如何获得我追求的结果?
答案 0 :(得分:3)
cmd /c "set PATH=test && echo %PATH%"
会在更改之前解释PATH
。这实际上是一个巧妙的技巧,用于导出setlocal/endlocal
块之外的环境变量:
ste xyzzy=twisty
startlocal
set xyzzy=plugh
endlocal && set xyzzy=%xyzzy%
通常(没有&& xyzzy=...
位,xyzzy
变量仍然是块后的twisty的初始值,但事实是%xyzzy%
被解释为之前整个endlocal
行,而在set
命令后执行endlocal
时,您可以导出更改。
如果要在set
之后解释变量,则需要延迟扩展:
cmd /v:on /c "set PATH=test && echo !PATH!"
/v:on
启用延迟扩展,使用!
代替%
表示您要使用延迟扩展。
答案 1 :(得分:2)
如果在父环境中启用延迟扩展时使用,则paxdiablo解决方案将无效。
来自批处理文件
@echo off
setlocal enableDelayedExpansion
rem !PATH! below will get expanded in parent batch environment
cmd /v:on /c "set PATH=test && echo !PATH!"
或从命令行
cmd /v:on
rem !PATH! below will get expanded in parent batch environment
cmd /v:on /c "set PATH=test && echo !PATH!"
简单的解决方案是逃避扩展,以便延迟到新的cmd环境中。
cmd /v:on
rem This works whether or not delayed expansion is enabled in the parent environment
cmd /v:on /c "set PATH=test && echo ^!PATH^!"
请注意,在第二个cmd中仍然需要/ v:on,因为cmd不会从父环境继承延迟扩展状态。
答案 2 :(得分:1)
你被immediate expansion of variables咬了。
cmd.exe
不是一种好的脚本语言。