重启后 Windows 10 环境路径变量丢失

重启后 Windows 10 环境路径变量丢失

我遇到了一个奇怪的问题,我在 Windows 中设置了路径变量,重新启动后它们就会消失,直到我查看环境变量设置。

我可以通过简单地执行以下操作来恢复它们:

System Properties=> [Environment Variables]=>[OK]

...然后它们再次被设置!

注意:如果我输入[SET],我可以在我的Path

例子:

我的路径上增加了一个指向: %USERPROFILE%\Documents\WindowsPowerShell\Scripts

在^^that^^目录中我有一个文件myscript.ps1

如果我在启动后打开 PowerShell,我可以输入“my [TAB]”,但它找不到该脚本。

打开环境变量对话框并选择后[OK],重新启动 PowerShell,我可以执行相同的“my [TAB]”并自动填充“myscript.ps1”而不会出现任何问题。

有人知道如何解决这个问题吗?

答案1

这不是一个真正的答案(太长并且太复杂,无法发表评论)。我会删除它如果证明是错误的。

请使用以下简单脚本检查您的path设置是否正式有效:

### Windows path validity check ###
Function myTest-Path {
Param( [Parameter(Mandatory=$false)] [string] $PathString='' )
    if ( '' -eq $PathString ) 
    { 
        '!empty' 
    } else {
        if ( $PathString -match '%' ) { 
            $PathString = (. cmd /c "echo($PathString")
        }
        if ( Test-Path -Path $PathString -IsValid) {
                [string] (Test-Path (Join-Path -ChildPath '' -Path $PathString))
            } else { '!wrong' }
    }
}

Write-Host '### Windows path validity check ###' -ForegroundColor Yellow
Write-Host 'checking $env:Path split' -ForegroundColor Yellow

$aux = $env:Path -replace ';$'        # remove trailing semicolon
$aux -split ";" | 
    ForEach-Object {
        [PSCustomObject]@{
            check = '$env:Path';
            valid = myTest-Path -PathString "$_";
            path  = "$_"
        }
    }

Write-Host 'checking HKCU:\Environment\ Path split' -ForegroundColor Yellow
if ( (Get-Item 'HKCU:\Environment\').GetValue('Path') ) {
    $aux = ([Microsoft.Win32.Registry]::CurrentUser.
        OpenSubKey("Environment")).
            GetValue("Path",$False, 
                [Microsoft.Win32.RegistryValueOptions]::
                    DoNotExpandEnvironmentNames) -replace ';$'
    $aux -split ";" | ForEach-Object {
        [PSCustomObject]@{
            check = 'HKCU:Path';
            valid = myTest-Path -PathString "$_";
            path  = "$_"
        }
    }
} else {
    Write-Host 'HKCU:\Environment\ Path does not exist' -ForegroundColor Cyan
}
Write-Host 'checking HKLM:\SYSTEM\…\Environment\ Path split' -ForegroundColor Yellow
$aux = ([Microsoft.Win32.Registry]::LocalMachine.
    OpenSubKey("SYSTEM\CurrentControlSet\Control\Session Manager\Environment")).
        GetValue("Path",$False, 
            [Microsoft.Win32.RegistryValueOptions]::
                DoNotExpandEnvironmentNames) -replace ';$'
$aux -split ";" | ForEach-Object {
        [PSCustomObject]@{
            check = 'HKLM:Path';
            valid = myTest-Path -PathString "$_";
            path  = "$_"
        }
    }

Write-Host 'checking $env:Path duplicates' -ForegroundColor Yellow
$auxArr = $env:Path.split( ";", [System.StringSplitOptions]::RemoveEmptyEntries )
for ($i = 0; $i -le $auxArr.Count; $i++) {
    for ($j = $i+1; $j -le $auxArr.Count -1; $j++) {
        try {
            if ( (Join-Path -ChildPath '' -Path $auxArr[$j] -ErrorAction Stop) -eq 
                 (Join-Path -ChildPath '' -Path $auxArr[$i] -ErrorAction Stop) )   {
                 Write-Host $('{0,4} {1,4} "{2}"' -f $i, $j, $auxArr[$i]) -ForegroundColor Cyan
                [PSCustomObject]@{
                    check = 'duplicate';
                    valid = "$i×$j";
                    path  = $auxArr[$i]
                }
            }
        } catch {
            Write-Host "$i $j invalid folder name in `$env:Path" -ForegroundColor Red
            Write-Host "$i`: [$($auxArr[$i])]" -ForegroundColor Red
            Write-Host "$j`: [$($auxArr[$j])]" -ForegroundColor Red
        }
    }
}

编辑:脚本已更新:

  • 正确处理可能为空的项目(我;;在 中遇到了奇怪的问题$env:Path),并且
  • 返回一个 s 数组PSCustomObject以实现更好的(潜在的)连续操作。

相关内容