我遇到了一个奇怪的问题,我在 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
以实现更好的(潜在的)连续操作。