cmd.exe的环境变量存储在哪里?



我知道如何在我的Windows 10机器上查找环境变量。

但是,当我在 cmd 中运行set时,还会列出其他变量.exe当我在 cmd 中运行set ENV_VAR=val命令时.exe,它会存储其他环境变量,这些变量似乎全局和用户环境变量存储在同一位置。

示例包括:APPDATA,HTTP_PROXY,SystemRoot,USERDNSDOMAIN。

这些存储在哪里?

cmd.exe shell 会动态创建一些伪变量。这些不是静态定义的。我不知道HTTP_PROXY。

CD
RANDOM
DATE
TIME
ERRORLEVEL

其他由系统控制。改变它们不太可能带来任何好处。

APPDATA
SystemRoot
USERDNSDOMAIN

https://winsourcecode.blogspot.com/2019/05/listenvironmentexe-list-system-user.html 是一个列出系统、用户和易失性变量以及生成的进程环境变量的程序。它还列出了帮助中详述的动态变量。

--------
System
--------
ComSpec=%SystemRoot%system32cmd.exe
DriverData=C:WindowsSystem32DriversDriverData
Link=/pdb:none /MAPINFO:LINES
NUMBER_OF_PROCESSORS=4
Etc
--------
Volatile - These are set at logon
--------
LOGONSERVER=\DESKTOP-UCDGI39
USERDOMAIN=DESKTOP-UCDGI39
HOMEDRIVE=C:
USERDOMAIN_ROAMINGPROFILE=DESKTOP-UCDGI39
Etc    
--------
User - These override system variables, and in the case of PATH are added to the system PATH
--------
MSDevDir=C:Program Files (x86)Microsoft Visual StudioCommonMSDev98
Etc
--------
Process - This is the combined environment from the above for the program
Variables starting with an equals sign, such as =C:=C:Windows are internal CMD variables
CMD simulates a default directory per drive like MSDos. This is how it keeps track
--------
=C:=C:WindowsSystem32
CommonProgramFiles=C:Program FilesCommon Files
CommonProgramFiles(x86)=C:Program Files (x86)Common Files
CommonProgramW6432=C:Program FilesCommon Files
COMPUTERNAME=DESKTOP-UCDGI39
ComSpec=C:WINDOWSsystem32cmd.exe
DriverData=C:WindowsSystem32DriversDriverData
HOMEDRIVE=C:
HOMEPATH=UsersDavid Candy
Etc
--------
Dynamic - These are updated each time they are used
--------
CD
DATE
TIME
RANDOM
ERRORLEVEL
CMDEXTVERSION
CMDCMDLINE
HIGHESTNUMANODENUMBER

环境变量在登录时创建并传递到 shell 资源管理器.exe。从现在开始,它们只在内存中。资源管理器启动的任何程序,包括cmd.exe都会获取资源管理器环境内存的副本。如果从cmd启动程序.exe它将获得CMD环境内存的副本。程序无法访问其他程序的内存,因此它只是一种方式。如果程序更改了变量,则只有该程序可以看到变量,或者更改后启动的程序。程序退出时,程序的内存块将被丢弃。

如果环境发生更改,SetX 会通知所有程序。然而,唯一众所周知的程序是资源管理器.exe。CMD 不侦听此消息。请参阅 https://learn.microsoft.com/en-us/windows/desktop/winmsg/wm-settingchange,了解如何执行此操作。因此,在使用SetX或您的程序发送消息后,资源管理器启动的新程序(包括CMD.exe)将进行更改。现有程序不会。现有程序将使用其现在旧环境块的副本启动其他程序。

一个常见的问题是如何运行setx并使其立即生效。答案是你不能。因此,您为将来运行Setx,并为当前的 CMD.exe 实例运行Set

请注意:当您在命令提示符下启动SET命令时,它们只会停留在您的提示符内,但是一旦您关闭该提示符,它们就会丢失,所以实际上,它们只是存储在命令提示符的 RAM 中。

最新更新