如何从C ++更改Windows shell(cmd.exe)环境variables?

我想编写一个程序,在shell(cmd.exe)实例中设置一个环境variables。 我的想法是,我可以在这个variables中存储一些状态,然后在随后的调用中再次使用它。

我知道有像SetEnvironmentVariable这样的命令,但我的理解是,这些只会改变当前进程的variables,并不会修改调用shell的variables。

具体而言,我希望能够做的是创build一个可以在两个目录之间弹跳的命令。 Pushd / Popd可以进入一个目录并返回,但是没有办法第二次返回到最初推送的目录。

一个常见的技术是编写一个env文件,然后从脚本中“调用”。

del env.var foo.exe ## writes to env.var call env.var 

MSDN声明如下 :

调用SetEnvironmentVariable对系统环境变量没有影响。 要以编程方式添加或修改系统环境变量,请将它们添加到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment注册表项中,然后广播一个WM_SETTINGCHANGE消息,并将lParam设置为字符串“Environment”。 这使应用程序(如shell)能够获取更新。 请注意,此项中列出的环境变量值限制为1024个字符。

考虑到环境有两个层次 – 系统和过程 – 在壳体中改变这些环境将会改变另一个过程的环境。 我不相信这是可能的。

在Windows中,当一个进程创建另一个进程时,它可以简单地让子进程继承当前的环境字符串,也可以给新的子进程一个修改的甚至全新的环境。

请参阅CreateProccess()win32 API的完整信息

没有支持的方式让子进程返回到父进程并更改父进程的环境。

也就是说,使用CMD脚本和PowerShell,父命令shell可以从子进程获取输出并更新自己的环境。 这是一种常见的技术。

个人而言,我不喜欢任何复杂的CMD脚本 – 他们是一个婊子写一个调试。 你可能想在PowerShell中做到这一点 – 有一个肯定的学习曲线,但它更加丰富。

有一种方法…只需将代码注入父进程,并在cmd的进程内存中调用SetEnvironmentVariableA。 注入后只是释放分配的内存。