1

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

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

具体来说,我希望能够创建一个可以在两个目录之间跳转的命令。Pushd/Popd 可以去一个目录并返回,但没有办法第二次返回到最初推送的目录。

4

4 回答 4

6

MSDN 声明如下

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

考虑到有两个级别的环境 - 系统和进程 - 更改 shell 中的环境将构成更改另一个进程的环境。我不相信这是可能的。

于 2009-04-21T19:04:53.373 回答
3

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

查看CreateProcess() win32 API的完整信息

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

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

就个人而言,我不喜欢任何类型的复杂 CMD 脚本 - 它们是编写调试程序的婊子。您可能希望在 PowerShell 中执行此操作 - 可以肯定的是,有一个学习曲线,但它要丰富得多。

于 2009-04-21T19:03:29.647 回答
3

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

del env.var
foo.exe ## writes to env.var
call env.var
于 2009-04-21T19:36:18.633 回答
2

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

于 2009-04-30T07:01:34.163 回答