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

tim*_*11g 2 windows cmd batch-file

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

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

如果我用这些行创建一个 TEST.CMD

SetEnvX.exe
set
Run Code Online (Sandbox Code Playgroud)

SETTEST.CMD 中命令的输出也没有显示由 SetEnvX.exe 创建的环境变量。

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

小智 5

这不可能。每当您调用SetEnvX.execmd.exe 时,都会生成一个从 cmd.exe 继承环境变量的子进程。

SetEnvX.exe在它的环境中设置环境变量,但是当它完成时,它的环境块消失。所以 parent cmd.exe 不会从 child 获取任何变量SetEnvX.exe

特尔;博士:

子进程可以继承父进程的环境变量,但父进程退出时不能继承子进程的环境变量。

解决方法:

如果SetEnvX.exe是自己编译的,不用设置环境变量,直接打印值然后在cmd.exe中捕获即可。例如:

for /f "delims=" %%k in ('SetEnvX.exe') do set VARIABLE=%%k
Run Code Online (Sandbox Code Playgroud)

  • 请注意,环境变量是 Unicode 并且 `for /f` 使用控制台的当前输出代码页逐行解码从管道中读取的内容。通常,您可能需要通过将控制台设置为代码页 65001 (UTF-8) 并让 SetEnvX.exe 将 UTF-8 写入标准输出来进行更多合作。 (2认同)