CMD中动态环境变量和正常环境变量之间的差异

CMD中动态环境变量和正常环境变量之间的差异,cmd,environment-variables,command-prompt,Cmd,Environment Variables,Command Prompt,我正在读一篇关于命令提示符中环境变量的文章 在本文后面的部分中,有一个表,其中列出了在命令提示符中常见的环境变量。此处列出的一些变量称为Volatile(只读)。该条中的一句话指出:- 动态环境变量是只读的,每次展开该变量时都会进行计算。当所有变量都用SET列出时,这些变量将不会出现在列表中。不要试图直接设置动态变量 我理解后两种说法。但我不明白第一个 怀疑:- %userprofile%是一个非易失性变量,解析为%SystemDrive%\Users\{username},而%homepat

我正在读一篇关于命令提示符中环境变量的文章

在本文后面的部分中,有一个表,其中列出了在命令提示符中常见的环境变量。此处列出的一些变量称为Volatile(只读)。该条中的一句话指出:-

动态环境变量是只读的,每次展开该变量时都会进行计算。当所有变量都用SET列出时,这些变量将不会出现在列表中。不要试图直接设置动态变量

我理解后两种说法。但我不明白第一个

怀疑:-

  • %userprofile%
    是一个非易失性变量,解析为
    %SystemDrive%\Users\{username}
    ,而
    %homepath%
    是一个易失性变量,解析为
    Users\{username}
    。这两个命令非常相似(除了
    systemdrive
    )。那么,为什么一个是易变的,另一个是非易变的

  • 变量是动态的标准是什么?是什么使
    %appdata%
    (只是一个例子)成为非易失性变量

  • 每次展开变量时都会计算动态变量,这对于
    %CD%%DATE%%time%%RANDOM%%
    等变量是有意义的,因为如果这些变量是非易失性的,它们将失去其功能。但是它将如何影响
    %homepath%

  • 一些非易失性变量中含有某种动态成分。例如,
    %userprofile%
    的路径中有
    %SystemDrive%
    {username}
    。那么这些变量为什么不是动态的呢


有三种类型的变量,其值是使用语法
%variable%
访问的!变数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!"