Windows:获取所有*当前*环境变量

标签 windows environment-variables

目标:从我的应用程序中我想启动任意命令,例如cmd.exe 与当前环境变量,例如当我的应用程序运行并且用户修改路径时,启动终端应该获取新路径。

根据我的理解,如果启动一个进程,它将从其启动进程接收环境变量值(继承值或单独值)。在 Windows 上,可以通过读取注册表项来访问环境变量的最新值(请参阅 question "Where are environment variables stored in registry?" )。它们按照配置存储在注册表中,例如Comspec:%SystemRoot%\system32\cmd.exe。因此,您将需要其他环境变量(例如 SystemRoot)的值来扩展它们。

不幸的是,当查看我的进程从父进程接收到的所有环境变量与我可以从注册表中读取的环境变量时,似乎存在很大差异。我只是无法使用继承的环境变量并用它们的值替换注册表配置的环境变量,因为这样用户在应用程序运行时删除的自定义环境变量将占上风。

在哪里可以找到Windows默认提供的环境变量,例如系统根

最佳答案

CreateEnvironmentBlock WINAPI可以用来获取当前的环境变量。它的 bInherit 参数允许您选择是否从进程继承变量。

演示它的 C++ 代码片段:

HANDLE userToken = 0;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &userToken))
{
    _tprintf(_T("ERROR: OpenProcessToken"));
    return 1;
}

void* envVars = 0;
if (!CreateEnvironmentBlock(&envVars, userToken, TRUE))
{
    _tprintf(_T("ERROR: CreateEnvironmentBlock"));
    return 1;
}

const wchar_t* iter = (const wchar_t*)envVars;
while (*iter)
{
    _tprintf(_T("ENV: %s\n"), iter);
    iter += _tcslen(iter) + 1;
}

DestroyEnvironmentBlock(envVars);

关于Windows:获取所有*当前*环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57140076/

相关文章:

r - 以编程方式设置环境变量

docker - 如何使用环境变量作为docker容器的名称?

windows - cmd 不显示某些文件

delphi - 如何更改环境变量并让其他应用程序在不注销的情况下看到该值?

powershell - PowerShell 中名称中带有点 (.) 的环境变量

.net - 在 win32 API 和 .NET 框架之间进行选择

docker - 如何获取docker镜像的所有可用环境变量?

c - 如何在 C 中打开 Windows 中的默认 Web 浏览器?

c++ - 将 Netbeans 与 Cygwin 和 SDL(包括 SDL.h)一起使用会产生奇怪的错误

windows - Stack Overflow 答案中 2>nul 的用途是什么?