c# - 如何刷新环境变量进程快照?
问题描述
如您所知,如果您开始一个.exe
不明显的环境,它会生成 env var 快照。因此,例如,您有一个 env var MY_ENV_VAR_FOO = hello
,并且您的 exe 运行并使用此 var 没有任何问题。但是(例如)您需要将此 env var 值从更改hello
为hello_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
和再次打开它之间?
解决方案
继续阅读WM_SETTINGCHANGE
。当 env 变量发生变化时,Windows 会通知所有顶级窗口。
如果您的应用程序是一个没有消息循环的控制台,您可能必须在工作线程上创建一个不可见的窗口才能捕获该消息。然后,您必须将 env var 更改事件传回主线程。
推荐阅读
- openssl - Openshift:创建直通安全路由
- spring - 在 Spring Boot Hibernate 中覆盖默认表模式
- c# - 为 SQL 连接字符串模拟用户 c# MVC
- arrays - 使用 $exists 的 MongoDB 查询和数组
- jupyter-notebook - 如何在不执行单元格的情况下加载 jupyter-notebook
- machine-learning - 机器学习中的差异结果
- html - 表格列宽的 Blazor 渲染
- c - Protostar Stack6 - 无缘无故的Segfault?
- .net-core - ASP.NET Core MVC 3.1 在短时间内注销
- python - 如何将列表从一个函数传递给一个类中的多个函数?