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

Windows cmd.exe的环境变量存储在哪里?,windows,cmd,Windows,Cmd,我知道如何在Windows 10计算机上查找环境变量 但是,当我在cmd.exe中运行set时,以及当我在cmd.exe中运行set ENV_VAR=val命令时,会列出其他变量,这些变量似乎不会存储在与全局和用户环境变量相同的位置 例如:APPDATA、HTTP_代理、SystemRoot、USERDNSDOMAIN 它们存储在哪里?小心:当您在命令提示符下启动SET命令时,它们只会停留在提示符内,但一旦关闭该提示符,它们就会丢失,因此实际上,它们只存储在命令提示符的RAM中。cmd.exe

我知道如何在Windows 10计算机上查找环境变量

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

例如:APPDATA、HTTP_代理、SystemRoot、USERDNSDOMAIN


它们存储在哪里?

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

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

CD
RANDOM
DATE
TIME
ERRORLEVEL
其他的是系统控制的。改变它们不太可能带来任何好处

APPDATA
SystemRoot
USERDNSDOMAIN
是一个列出系统、用户和易失性变量以及由此产生的过程环境变量的程序。它还列出了帮助中详细介绍的动态变量

--------
System
--------
ComSpec=%SystemRoot%\system32\cmd.exe
DriverData=C:\Windows\System32\Drivers\DriverData
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 Studio\Common\MSDev98
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:\Windows\System32
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=DESKTOP-UCDGI39
ComSpec=C:\WINDOWS\system32\cmd.exe
DriverData=C:\Windows\System32\Drivers\DriverData
HOMEDRIVE=C:
HOMEPATH=\Users\David Candy
Etc

--------
Dynamic - These are updated each time they are used
--------
CD
DATE
TIME
RANDOM
ERRORLEVEL
CMDEXTVERSION
CMDCMDLINE
HIGHESTNUMANODENUMBER
环境变量在登录时创建并传递给shell Explorer.exe。从现在起,它们只在记忆中。任何程序资源管理器启动,包括cmd.exe都会获得资源管理器环境内存的副本。如果从cmd.exe启动程序,它将获得cmd环境内存的副本。程序无法访问其他程序的内存,因此这只是一种方式。如果一个程序更改了一个变量,只有该程序才能看到,或者更改后启动的程序。当程序退出时,程序的内存块被丢弃

如果环境发生变化,SetX将通知所有程序。但是,唯一已知的侦听此消息的程序是Explorer.exe。CMD不侦听此消息。看看它是如何做到这一点的。因此,在使用SetX或您的程序发送消息后,由Explorer启动的新程序(包括CMD.exe)将发生更改。现有的程序不会。现有程序将使用其现有环境块的副本启动其他程序


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

你能提供这些额外变量的列表吗?其中一些变量可能是由脚本创建的,完整环境由WINAPI函数加载,例如
CreateEnvironmentBlock
或私有shell32函数
RegenerateUserEnvironment
CreateEnvironmentBlock
从多个源中提取:“HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\environment”,“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList”、“HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion”、“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\”、“HKU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell文件夹”、“HKU\\Environment”、“HKU\\Volatile Environment”\“,
GetUserNameExW
GetComputerNameExW
。我可以在回答中按源分解变量,但大多数变量不应直接更改。它们当前存储的位置应视为不透明的实现细节。通过注册表永久设置变量(但不影响当前的
cmd.exe
实例)..@aschipfl:my point Justice:
setx
将其永久设置,而
set
仅用于会话本身。Windows API还支持动态变量,例如
\uuuu CD\uuuu
\uuuu APPDIR\uuuu
。我注意到,在我的机器上,温度变量有三(3)组;系统、用户和进程。系统是基础,由用户覆盖,程序的结果变量就是进程。过程就是你所使用的。系统和用户是它们的来源。