Cmd 为动态变量查找初始环境变量值?

Cmd 为动态变量查找初始环境变量值?,cmd,Cmd,目标是重置当前cmd.exe shell,使其具有原始环境变量集。这应该包括删除在cmd.exe shell启动后创建的当前环境变量 可以从注册表读取系统和用户环境变量。但是,动态变量(如ALLUSERSPROFILE、APPDATA、LOGONSERVER等)不在这些位置。在哪里可以找到 因此,代码无法删除在cmd.exe shell启动后创建的变量。这是因为它可能是一个动态变量 将这两个文件放在同一目录中 ==Do-Environment.bat @ECHO OFF SET "TEMPFIL

目标是重置当前cmd.exe shell,使其具有原始环境变量集。这应该包括删除在cmd.exe shell启动后创建的当前环境变量

可以从注册表读取系统和用户环境变量。但是,动态变量(如ALLUSERSPROFILE、APPDATA、LOGONSERVER等)不在这些位置。在哪里可以找到

因此,代码无法删除在cmd.exe shell启动后创建的变量。这是因为它可能是一个动态变量

将这两个文件放在同一目录中

==Do-Environment.bat

@ECHO OFF
SET "TEMPFILE=%TEMP%\do-environment-script.bat"
powershell -NoLogo -NoProfile -File "%~dp0Do-Environment.ps1" >"%TEMPFILE%"
type "%TEMPFILE%"
CALL "%TEMPFILE%"
EXIT /B %ERRORLEVEL%
==Do-Environment.ps1

$Vars = @{}

$UserVars = 'HKCU:\Environment'
$SystemVars = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment'

(Get-Item -Path $SystemVars).Property |
    ForEach-Object {
        $KeyName = $_
        $KeyValue = (Get-Item -Path $SystemVars).GetValue($KeyName, $null)
        $Vars[$KeyName] = $KeyValue
    }

(Get-Item -Path $UserVars).Property |
    ForEach-Object {
        $KeyName = $_
        $KeyValue = (Get-Item -Path $UserVars).GetValue($KeyName, $null)
        if (($null -eq $Vars[$KeyName]) -or ($KeyName -ne 'Path')) {
            $Vars[$KeyName] = $KeyValue
        } else {
            $Vars[$KeyName] = $Vars[$KeyName] + ';' + $KeyValue
        }
        #'SET "{0}={1}"' -f @($KeyName, $KeyValue)
    }

$Vars.Keys | Sort-Object | ForEach-Object { 'SET "{0}={1}"' -f @($_, $Vars[$_]) }

大多数是由Windows本身预定义的,尤其是那些依赖于用户帐户的。它们不是永久性存储在Windows注册表中。这些基于“外壳文件夹”的环境变量由作为Windows桌面运行的Windows资源管理器实例自动定义,具体取决于注册表项
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User shell folders
(REG\u EXPAND\u SZ)和
shell folders
(REG_SZ类型的扩展版本,用于向下兼容)。如果使用PowerShell,请尝试从“advapi32.dll”中PInvoke
OpenProcessToken
,并从userenv.dll中选择
CreateEnvironmentBlock
CreateEnvironmentBlock
从许多来源提取数据:当前
SystemRoot
SystemDrive
;“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList”;“HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment”;
GetComputerNameExW
;“HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion”;
GetTokenInformation
TokenUser
;“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\”;”HKU\\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell文件夹“;“HKU\\Environment”;“HKU\\Volatile Environment\”和
GetUsernameXw
。请注意,所有“Environment”和“Environment”中的值\"键总是在两个过程中枚举:
REG\u SZ
首先加载值,然后加载
REG\u EXPAND\u SZ
值。这支持依赖于
REG\u SZ
值的
REG\u EXPAND\u SZ
值。大多数值是由Windows本身预定义的,尤其是那些依赖于用户帐户的值。它们不是持久存储在Windows中的Windows注册表。作为Windows桌面运行的Windows资源管理器实例根据注册表项
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User shell folders
(REG\u EXPAND\u SZ)和
shell folders
(REG_SZ类型的扩展版本,用于向下兼容)。如果使用PowerShell,请尝试从“advapi32.dll”中PInvoke
OpenProcessToken
,并从userenv.dll中选择
CreateEnvironmentBlock
CreateEnvironmentBlock
从许多来源提取数据:当前
SystemRoot
SystemDrive
;“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList”;“HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment”;
GetComputerNameExW
;“HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion”;
GetTokenInformation
TokenUser
;“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\”;”HKU\\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell文件夹“;“HKU\\Environment”;“HKU\\Volatile Environment\”和
GetUsernameXw
。请注意,所有“Environment”和“Environment”中的值\“始终在两个过程中枚举键:
REG\u SZ
首先加载值,然后加载
REG\u EXPAND\u SZ
值。这支持依赖于
REG\u SZ
值的
REG\u EXPAND\u SZ
值。