如何在执行cmd / c“command”后确定PATH环境变量?

时间:2012-01-15 12:06:43

标签: batch-file cmd

我想通过运行

来确定执行批处理文件(vcvarsall.bat)后PATH环境变量是什么
cmd /c "vcvarsall.bat x86_amd64 && echo %PATH%"

但是发生的事情并不是我所期待的。例如,如果我运行:

cmd /c "set PATH=test && echo %PATH%"

我只是获得主机进程的PATH,而不是我预期的“测试”,因为echo%PATH%应该在子进程的上下文中运行,而不是父进程。那么,为什么会发生这种情况,我如何获得我追求的结果?

3 个答案:

答案 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不是一种好的脚本语言。