代码之家  ›  专栏  ›  技术社区  ›  Steve Rowe

如何更改C++中的Windows外壳(CMD.exe)环境变量?

  •  1
  • Steve Rowe  · 技术社区  · 15 年前

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

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

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

    4 回复  |  直到 15 年前
        1
  •  6
  •   Jeff Yates    15 年前

    MSDN states the following :

    使命感 SetEnvironmentVariable 对系统环境的影响 变量。以编程方式添加或删除 将它们添加到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 注册表项,然后 WM_SETTINGCHANGE 消息 lParam “环境”。这允许 环境变量的值 人物。

    考虑到环境有两个层次——系统和过程,改变shell中的环境将构成改变另一个过程的环境。我认为这是不可能的。

        2
  •  3
  •   Foredecker    15 年前

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

    CreateProccess() win32 API

    子进程无法通过受支持的方式返回到父进程并更改父进程的环境。

    仅就个人而言,我不喜欢任何复杂的CMD脚本——它们是编写调试程序的婊子。您可能希望在PowerShell中实现这一点—确实有一个学习曲线,但它要丰富得多。

        3
  •  3
  •   Sanjaya R    15 年前

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

    del env.var
    foo.exe ## writes to env.var
    call env.var
    
        4
  •  2
  •   jazu100    15 年前

    只需将代码注入父进程,并在内部调用SetEnvironmentVariableA即可