CMD中动态环境变量和正常环境变量之间的差异
我正在读一篇关于命令提示符中环境变量的文章 在本文后面的部分中,有一个表,其中列出了在命令提示符中常见的环境变量。此处列出的一些变量称为Volatile(只读)。该条中的一句话指出:- 动态环境变量是只读的,每次展开该变量时都会进行计算。当所有变量都用SET列出时,这些变量将不会出现在列表中。不要试图直接设置动态变量 我理解后两种说法。但我不明白第一个 怀疑:-CMD中动态环境变量和正常环境变量之间的差异,cmd,environment-variables,command-prompt,Cmd,Environment Variables,Command Prompt,我正在读一篇关于命令提示符中环境变量的文章 在本文后面的部分中,有一个表,其中列出了在命令提示符中常见的环境变量。此处列出的一些变量称为Volatile(只读)。该条中的一句话指出:- 动态环境变量是只读的,每次展开该变量时都会进行计算。当所有变量都用SET列出时,这些变量将不会出现在列表中。不要试图直接设置动态变量 我理解后两种说法。但我不明白第一个 怀疑:- %userprofile%是一个非易失性变量,解析为%SystemDrive%\Users\{username},而%homepat
是一个非易失性变量,解析为%userprofile%
,而%SystemDrive%\Users\{username}
是一个易失性变量,解析为%homepath%
。这两个命令非常相似(除了Users\{username}
)。那么,为什么一个是易变的,另一个是非易变的systemdrive
- 变量是动态的标准是什么?是什么使
(只是一个例子)成为非易失性变量%appdata%
- 每次展开变量时都会计算动态变量,这对于
等变量是有意义的,因为如果这些变量是非易失性的,它们将失去其功能。但是它将如何影响%CD%%DATE%%time%%RANDOM%%
%homepath%
- 一些非易失性变量中含有某种动态成分。例如,
的路径中有%userprofile%
和%SystemDrive%
。那么这些变量为什么不是动态的呢{username}
%variable%
或访问的!变数在Windows命令提示符窗口或批处理文件中使用命令的选项setlocal
,即使用%SystemRoot%\System32\cmd.exe
,启用延迟环境变量扩展后的代码>
1.持久存储变量
Windows注册表中持久存储了环境变量
用户存储在Windows注册表项下的变量:
HKEY_CURRENT_USER\Environment
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
系统存储在Windows注册表项下的变量:
HKEY_CURRENT_USER\Environment
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
user变量仅为存储它们的用户注册表配置单元所在的帐户定义(文件%UserProfile%\ntuser.dat
)。系统变量是为Windows计算机上使用的所有帐户定义的(文件%SystemRoot%\System32\config\system
)
通过打开Windows控制面板,单击系统,在高级系统设置上单击下一步(左侧),然后单击环境变量按钮,可以查看、编辑和删除持久存储的变量。上半部分用于当前用户帐户的用户变量,下半部分用于自Windows XP以来的系统变量
自Windows XP以来,默认情况下只有TEMP
和TMP
变量定义为user
预定义的系统变量列表是从Windows XP开始的:
ComSpec
NUMBER_OF_PROCESSORS
OS
PATH
PATHEXT
PROCESSOR_ARCHITECTURE
PROCESSOR_IDENTIFIER
PROCESSOR_LEVEL
PROCESSOR_REVISION
TEMP
TMP
windir
默认情况下,在Windows Vista和更新的Windows版本中还定义了系统变量PSModulePath
任何预定义的系统变量(路径
和路径
除外)都不应删除或修改,因为这可能会导致许多问题,甚至可能导致Windows无法再启动。我强烈建议在开始实验之前,使用虚拟机对预定义的系统变量进行实验,该变量存在整个虚拟机映像的备份
1.1持久存储变量的备份
建议先备份用户和系统变量,然后打开命令提示窗口并运行,例如:
md C:\VariablesBackup 2>nul
%SystemRoot%\System32\reg.exe EXPORT HKCU\Environment "C:\VariablesBackup\UserVariables.reg"
%SystemRoot%\System32\reg.exe EXPORT "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "C:\VariablesBackup\SystemVariables.reg"
%DATE% %TIME% is: 31.01.2021 13:54:30,67
!DATA! !TIME! is: 31.01.2021 13:54:30,68
%RANDOM%/!RANDOM!: 18841/27537
%DATE% %TIME% is: 31.01.2021 13:54:30,67
!DATA! !TIME! is: 31.01.2021 13:54:33,12
%RANDOM%/!RANDOM!: 18841/16705
%DATE% %TIME% is: 31.01.2021 13:54:30,67
!DATA! !TIME! is: 31.01.2021 13:54:36,16
%RANDOM%/!RANDOM!: 18841/32668
With command extensions disabled:
Date/time is:
Current dir: ""
With command extensions enabled:
Date/time is: 31.01.2021 14:17:42,92
Current dir: "C:\Temp\Development & Test!"
1.2永久存储变量的恢复
恢复用户变量可以在命令提示窗口内完成,前提是在执行备份之前使用:
%SystemRoot%\System32\reg.exe DELETE "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /f
%SystemRoot%\System32\reg.exe IMPORT "C:\VariablesBackup\UserVariables.reg"
%SystemRoot%\System32\reg.exe DELETE HKCU\Environment /f
%SystemRoot%\System32\reg.exe IMPORT "C:\VariablesBackup\SystemVariables.reg"
恢复系统变量可以在以管理员身份打开的命令提示符窗口内完成,前提是在之前使用以下命令进行备份:
%SystemRoot%\System32\reg.exe DELETE "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /f
%SystemRoot%\System32\reg.exe IMPORT "C:\VariablesBackup\UserVariables.reg"
%SystemRoot%\System32\reg.exe DELETE HKCU\Environment /f
%SystemRoot%\System32\reg.exe IMPORT "C:\VariablesBackup\SystemVariables.reg"
建议在从备份中还原用户和系统变量后重新启动Windows,以确保所有进程都使用还原的变量
1.3使用批处理文件修改路径
批处理文件程序员考虑使用批处理文件修改用户或系统路径
,应首先阅读:
注意:在批处理文件中使用带有%PATH%
的命令SETX来修改用户或系统路径
变量是绝对的禁止操作
在安装程序(可执行文件或脚本)时,使用批处理文件修改用户或系统路径
的唯一原因是该程序主要由Windows命令行中的用户使用。如果一个程序要求它的目录或它的一个子目录在PATH
中才能工作,那么它的设计就很糟糕。如果程序将文件夹路径添加到系统路径
左侧的fo中,则该程序的设计非常糟糕
%DATE% %TIME% is: 31.01.2021 13:54:30,67
!DATA! !TIME! is: 31.01.2021 13:54:30,68
%RANDOM%/!RANDOM!: 18841/27537
%DATE% %TIME% is: 31.01.2021 13:54:30,67
!DATA! !TIME! is: 31.01.2021 13:54:33,12
%RANDOM%/!RANDOM!: 18841/16705
%DATE% %TIME% is: 31.01.2021 13:54:30,67
!DATA! !TIME! is: 31.01.2021 13:54:36,16
%RANDOM%/!RANDOM!: 18841/32668
@echo off
setlocal DisableExtensions DisableDelayedExpansion
echo/
echo With command extensions disabled:
echo/
echo Date/time is: %DATE% %TIME%
echo Current dir: "%CD%"
endlocal
setlocal EnableExtensions DisableDelayedExpansion
echo/
echo With command extensions enabled:
echo/
echo Date/time is: %DATE% %TIME%
echo Current dir: "%CD%"
echo/
for %%I in (%CMDCMDLINE%) do if /I "%%~I" == "/c" pause & goto EndBatch
:EndBatch
endlocal
With command extensions disabled:
Date/time is:
Current dir: ""
With command extensions enabled:
Date/time is: 31.01.2021 14:17:42,92
Current dir: "C:\Temp\Development & Test!"