首页 > 解决方案 > 如何刷新环境变量进程快照?

问题描述

如您所知,如果您开始一个.exe不明显的环境,它会生成 env var 快照。因此,例如,您有一个 env var MY_ENV_VAR_FOO = hello,并且您的 exe 运行并使用此 var 没有任何问题。但是(例如)您需要将此 env var 值从更改hellohello_word(而不是关闭您的 .exe)。

什么问题?您.exe有 env var 快照,但对您更新了值一无所知。

为了获得新的 env var 值,您需要重新启动.exe. 您可以通过几种方式制作它,例如只需关闭.exe并用手再次打开它,或者您可以在脚本的帮助下完成。.exe有一个启动这个脚本的逻辑

所以,我写了脚本(因为实际上我没有直接访问关闭和打开我的.exe

有一个脚本

set MY_TARGET=C:\My_program

taskkill /IM My_program.exe /F

@echo off
if %errorlevel% NEQ 0  echo ERROR!!! & goto :exit
@echo on

timeout 10

start "" %MY_TARGET%\My_program.exe

:exit

脚本正在做的是关闭.exe并在 10 秒后再次打开它。

所以,看起来重启.exe已经完成,但问题是每个新进程都从启动它的进程继承环境变量......

这意味着(正如我上面所说,我.exe有一个启动脚本的逻辑)我.exe有 env vars 快照,脚本正在启动并从我的快照.exe,然后编写我的脚本.exe并在 10 秒后再次启动它,但是当脚本启动时.exe.exe再次从启动他的人那里获取环境变量快照->脚本,但是脚本具有相同的(没有更新)环境变量...

所以,问题是 - 有没有办法刷新环境变量?可能有一种在线我需要添加到脚本中 -refresh_env_vars_command在关闭.exe和再次打开它之间?

标签: c#windows

解决方案


继续阅读WM_SETTINGCHANGE。当 env 变量发生变化时,Windows 会通知所有顶级窗口。

如果您的应用程序是一个没有消息循环的控制台,您可能必须在工作线程上创建一个不可见的窗口才能捕获该消息。然后,您必须将 env var 更改事件传回主线程。


推荐阅读