可执行文件如何在父CMD或批处理上下文中设置环境变量?

时间:2017-09-15 19:14:14

标签: windows batch-file cmd

我有一个设置环境变量的Windows控制台可执行文件(称之为SetEnvX.exe)。在内部,它在Windows API中调用SetEnvironmentVariable。那个电话成功了。

在执行SetEnvX.exe的父CMD实例中,如果在SetEnvX.exe之后立即运行SET,则它创建的环境变量不存在。

如果我用行

创建TEST.CMD
SetEnvX.exe
set

TEST.CMD中SET命令的输出也不显示由SetEnvX.exe创建的环境变量。

SetEnvX.exe等程序如何创建一个环境变量,该变量存在于交互式CMD shell或批处理文件的范围内?换句话说,我不想将环境变量放入全局持久环境中。

2 个答案:

答案 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执行,通常没有自己的进程。