(从您的问题中推测一些细节)
在CMD中,当批处理脚本修改环境变量时,默认行为是修改执行它的CMD进程的环境变量。
现在,如果你有一个批处理脚本调用另一个批处理脚本,有3种方法来做到这一点。
1. 直接执行批处理文件:
REM call q.bat
q.bat
REM 这一行永远不会运行
通常情况下,你不想使用这个方式,因为它不会返回到调用批处理脚本。这更像
goto
而不是
gosub
。CMD进程只是从一个脚本切换到另一个脚本。
2. 用
call
执行:
REM call q.bat
CALL q.bat
REM q.bat影响的更改将出现在此处。
这是一个批处理文件调用另一个批处理文件的最常见方式。当
q.bat
退出时,控制权将返回给调用者。由于这是相同的CMD进程,所以对环境的更改仍然存在。
注意:如果
q.bat
使用
EXIT
语句,它可以导致CMD进程终止,而不返回控制到调用脚本。
注意2:如果
q.bat
使用
EXIT /B
,则CMD进程不会退出。这对于设置
ERRORLEVEL
很有用。
3. 在新的CMD进程中执行:
REM call q.bat
CMD /C q.bat
q.bat运行在一个新的CMD进程中,它影响那个进程的环境,而不是调用者正在运行的CMD。
注意:如果
q.bat
使用
EXIT
,它将不会终止调用者的进程。
SETLOCAL
CMD命令将为当前脚本创建一个新的环境。该环境中的更改不会影响调用者。一般来说,
SETLOCAL
是一个好的实践,避免意外泄漏环境变量的更改。
要使用
SETLOCAL
并将环境更改推送到调用脚本,请以以下方式结束脚本:
ENDLOCAL && SET X=%X% && SET Y=%Y%
这将把X和Y的值推送到父环境中。
另一方面,如果你想运行另一个进程(不是CMD脚本)并使它影响当前脚本的环境,则让工具生成一个批处理文件,其中包含所需的更改,然后执行该批处理文件。
REM q.exe将写入%TEMP%\runme.cmd,它看起来像:
REM set X=Y
q.exe
call "%TEMP%\runme.cmd"