寻找动态变量的初始环境变量值?

时间:2019-08-29 22:59:47

标签: cmd

目标是将当前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[$_]) }

0 个答案:

没有答案