Batch file 如何在执行cmd/c";后确定PATH环境变量;命令;?

Batch file 如何在执行cmd/c";后确定PATH环境变量;命令;?,batch-file,cmd,Batch File,Cmd,我想在运行批处理文件(vcvarsall.bat)后确定PATH环境变量是什么 cmd /c "vcvarsall.bat x86_amd64 && echo %PATH%" 但所发生的并不是我所期望的。例如,如果我运行: cmd /c "set PATH=test && echo %PATH%" 我只是得到了主机进程的路径,而不是我预期的“测试”,因为echo%PATH%应该在子进程的上下文中运行,而不是在父进程的上下文中运行。那么,为什么会发生这种情况,我

我想在运行批处理文件(vcvarsall.bat)后确定PATH环境变量是什么

cmd /c "vcvarsall.bat x86_amd64 && echo %PATH%"
但所发生的并不是我所期望的。例如,如果我运行:

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

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

你会被这种情况所困扰


cmd.exe
不是一种好的脚本语言。

你会被它咬到的

cmd /c "set PATH=test && echo %PATH%"
cmd.exe
不是一种好的脚本语言

cmd /c "set PATH=test && echo %PATH%"
将在更改路径之前解释路径。这实际上是在
setlocal/endlocal
块之外导出环境变量的一个巧妙技巧,它使用:

ste xyzzy=twisty
startlocal
set xyzzy=plugh
endlocal && set xyzzy=%xyzzy%
通常(如果没有
&&xyzy=…
位,
xyzy
变量仍然是块后twisty的初始值,但是
%xyzy%
在整个
endlocal
行之前解释,而
set
endlocal
命令之后操作,允许您导出更改

如果要在
设置之后解释变量,则需要延迟展开:

cmd /v:on /c "set PATH=test && echo !PATH!"
/v:on
打开延迟扩展,使用
而不是
%
表示要使用延迟扩展

在更改
路径之前,将对其进行解释。这实际上是在
setlocal/endlocal
块之外导出环境变量的一个巧妙技巧,使用:

ste xyzzy=twisty
startlocal
set xyzzy=plugh
endlocal && set xyzzy=%xyzzy%
通常(如果没有
&&xyzy=…
位,
xyzy
变量仍然是块后twisty的初始值,但是
%xyzy%
在整个
endlocal
行之前解释,而
set
endlocal
命令之后操作,允许您导出更改

如果要在
设置之后解释变量,则需要延迟展开:

cmd /v:on /c "set PATH=test && echo !PATH!"

/v:on
打开延迟扩展,使用
而不是
%
表示要使用延迟扩展。

如果在父环境中启用延迟扩展,则paxdiablo解决方案将不起作用

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^!"
从批处理文件

@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不会从父环境继承延迟扩展状态。

如果在父环境中启用延迟扩展,则paxdiablo解决方案将不起作用

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^!"
从批处理文件

@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不会从父环境继承延迟扩展状态。

如果已启用延迟扩展,则失败-如果已启用延迟扩展,请参阅失败-请参阅cmd.exe根本不是脚本语言。cmd.exe根本不是脚本语言。
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^!"