我有一个设置环境变量的Windows控制台可执行文件(称之为SetEnvX.exe)。在内部,它在Windows API中调用SetEnvironmentVariable
。那个电话成功了。
在执行SetEnvX.exe的父CMD实例中,如果在SetEnvX.exe之后立即运行SET
,则它创建的环境变量不存在。
如果我用行
创建TEST.CMDSetEnvX.exe
set
TEST.CMD中SET
命令的输出也不显示由SetEnvX.exe创建的环境变量。
SetEnvX.exe等程序如何创建一个环境变量,该变量存在于交互式CMD shell或批处理文件的范围内?换句话说,我不想将环境变量放入全局持久环境中。
答案 0 :(得分:4)
这是不可能的。每当您调用SetEnvX.exe
cmd.exe时,都会生成一个从cmd.exe继承环境变量的子进程。
SetEnvX.exe
在其环境中设置环境变量,但是当它完成时,它的环境块就会消失。因此,父cmd.exe不会从子SetEnvX.exe
获取任何变量。
<强> TL; DR:强>
子进程可以继承父进程的环境变量,但父进程退出后不能继承子进程。
解决方法:强>
如果您自己编译SetEnvX.exe
,则可以打印该值,然后在cmd.exe中捕获它,而不是设置环境变量。 E.g:
for /f "delims=" %%k in ('SetEnvX.exe') do set VARIABLE=%%k
答案 1 :(得分:1)
每个进程在出生时都会继承父进程的变量。您不能从子级继承变量。虽然注册表中存在“全局持久性环境”,但不是随机CMD.EXE过程中的环境。
请注意,批处理文件由CMD.EXE执行,通常没有自己的进程。