【问题标题】:Is there a way to refresh environment variables for a running process?有没有办法为正在运行的进程刷新环境变量?
【发布时间】:2022-01-03 19:05:02
【问题描述】:

我已经看到了有关刷新 powershell 和 cmd 终端的各种帖子,但我不确定是否还有一种方法可以更新已经运行的进程(除了重新启动之外)的环境变量,它既不是 powershell 也不是 cmd .这些帖子都非常有助于帮助我了解幕后的工作原理:

https://superuser.com/questions/130029/refresh-environment-variable

https://www.michaelmiklis.de/update-environment-variables-in-current-process/

而这篇文章(同样的问题,但与 linux 相关)似乎表明 linux 中有一种方法:

Changing environment variable of a running process

我很好奇 Windows 中是否有类似的方法。我的假设是不,你必须重新启动,但我找不到明确的不。为什么我想这样做是因为我正在开发一个测试硬件的系统。顶级工具是能够调用各种代码模块(python、.net、.exes 等)的定序器。在这个顶级工具中,我调用了一个 python 模块,它期望设置一个特定的环境变量。但是,在扫描条形码之前,我不知道这个变量应该是什么。我编写了可以设置环境变量并检查是否设置了环境变量的 C# 代码,但是由于尚未使顶级进程意识到更改,因此 python 模块实际上不可能具有正确的变量值,除非在一切开始之前就已经知道了。

【问题讨论】:

  • 在进程创建时在进程环境块中设置环境变量。一旦创建了流程,就没有支持的方式来更改它。如果您正在创建一个流程,您可以在调用 CreateProcess 时提供自定义环境。
  • 之前的评论部分错误:您可以在运行时更改进程的环境,可以是单个变量 (SetEnvironmentVariable),也可以是整个环境变量集 (SetEnvironmentStrings)。您只能在进程内更改环境。

标签: windows operating-system environment-variables


【解决方案1】:

当程序更改任何环境变量时,应该让其他进程知道如下(我认为有多种方式可以发送此消息)

     status2 = (DWORD)SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)NULL,SMTO_ABORTIFHUNG, 10, &result2);

所有进程都应该监听这个消息,并重新加载环境变量作为响应。 MSVC2019 Professional 可以向 Path 用户级环境变量添加多达 16 个(+?)非常长的路径。请注意,Windows 10 在其系统->高级->环境变量->用户级别对话框中有 2047 个字符的限制。这让我很伤心,因为看起来超出限制的路径被忽略了。超过限制时,GUI 将不允许更改。

【讨论】:

  • 什么语言和上下文将实现您共享的代码的 sn-p?当我创建一个环境变量时,我是通过 C# 这样做的。我可以从该代码发送此消息还是应该写其他东西来这样做?
  • 您的代码不正确,lparam 应该是“环境”。 Explorer.exe 是唯一关心此消息的进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2010-10-05
  • 2017-03-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2020-02-13
相关资源
最近更新 更多