当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

作者:精品下载站 日期:2024-12-14 07:55:10 浏览:15 分类:玩电脑

使用 PowerShell 进入正确的 %PATH%


[玩转系统] 使用 PowerShell 进入正确的 %PATH%

从技术角度来看,我不认为有任何伤害或惩罚。但如果你像我一样,你喜欢保持东西整洁。此外,这还提供了教授一些 PowerShell 概念和技术的机会。让我们看看如何使用PowerShell来管理%PATH%环境变量。

显示路径

首先要做的是查看%PATH%的当前值。这是一个环境变量,因此您可以使用 ENV: PSDrive。引用项目的简单方法是 $env:Path 或 $env:Computername。

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

这是一个用分号分隔的一长串目录,这意味着您可以将该字符串拆分为一个数组。

$env:path -split ";"

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

另一种选择是使用这样的表达式来调用 String 对象上的 Split() 方法。

($env:path).split(";")

无论哪种情况,最终结果都是相同的,都是位置数组。

验证路径位置

我已经知道如何使用 Test-Path cmdlet。为了找到不再存在的位置,我需要测试每个位置。

$env:path -split ";" | Where-Object {-not (Test-Path $_) }

该表达式表示“从数组中获取每个路径并过滤其中 Test-Path 返回 $False”。请记住,-Not 运算符将布尔值颠倒过来。因此,如果 Test-Path 给我 $False,-Not 运算符会将其转换为 $True,这意味着Where-Object 将其保留在管道中。

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

这些位置不再存在于我的计算机上,即使它们列在 %PATH% 中。再说一遍,据我所知,这不会造成任何伤害,但我喜欢保持一切整洁。

跨平台工作

Windows 机器应该定义 $env:Path。但如果没有,您也可以直接使用.NET Framework 来达到相同的结果。

[System.Environment]::GetEnvironmentVariable("PATH") -split ";" | Where-Object {-not (Test-Path $_) }

在 Linux 上,我假设 MacOS 虽然我没有进行任何测试,但你还应该有一个 %PATH% 变量。但要小心,因为 PATH 区分大小写。

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

但如果您注意到有一个不同的分隔符。但不用担心。如果您正在编写一些跨平台运行的代码,.NET 包含一个有用的类,它告诉您使用什么字符作为分隔符或分隔符。

$splitter = [System.IO.Path]::PathSeparator
[System.Environment]::GetEnvironmentVariable("PATH") -split $splitter | Where-Object {-not (Test-Path $_) }

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

思考对象

我希望您考虑的另一种方法是考虑将对象写入管道,特别是当您考虑创建可重用工具时。这是一个原型函数。

Function Test-PathEnv {
[cmdletbinding()]
Param()

$splitter = [System.IO.Path]::PathSeparator

$pathenv = [System.Environment]::GetEnvironmentVariable("PATH")
if ($pathenv) {
    $env:PATH -split $splitter | Foreach-Object {
    # create a custom object based on each path
    [pscustomobject]@{
        Computername = [System.Environment]::MachineName
        Path   = $_
        Exists = Test-Path $_
    }
} 
}
else {
    Write-Warning "Failed to find an environmental path"
}
}

通常我会避免直接调用 .NET,但因为我希望它能够跨平台工作,所以我需要使用这些类。 Linux 机器上的 ENV: 驱动器与 Windows 上的驱动器不同。

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

清理

我想我不应该在没有提到如何解决问题的情况下就离开你。我将把非 Windows 修复留给您,因为它可能会因平台而异。在 Windows 中,%PATH% 实际上由用户特定的设置组成,这些设置存储在 HKCU:\Environment 下的注册表中

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

并在 HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 下找到系统值。

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

安全的清理方法是使用 Windows 10 控制面板并手动编辑这些设置。但是 PowerShell 有修改注册表的工具,为什么不呢?可能会出现什么问题?

我将使用我的函数来获取丢失的位置,并创建注册表位置的备份副本。

$missing = Test-PathEnv | Where-object {-not $_.exists}
$savedUser = (Get-itemproperty -path HKCU:\Environment\).path
$savedSystem = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment').path

我不知道丢失的路径是用户值还是系统值,因此我需要检查两者。我可以将每个保存的值拆分为一个数组,并使用 -Contains 运算符进行验证。

foreach ($p in $missing.path) {
    Write-Host "Searching for $p" -ForegroundColor Yellow
    $user = (Get-itemproperty -path 'HKCU:\Environment\').path -split ";"
    if ($user -contains $p) {
        Write-Host "Found in HKCU" -ForegroundColor green
         #insert clean up code

    }
    $system = (Get-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment').path -split ";"
    if ($system -contains $p) {
        Write-Host "Found in HKLM" -ForegroundColor Green
        #insert clean up code
    }
}

我正在慢慢构建一个代码解决方案。我的计划是重建适当的路径数组而不丢失丢失的位置,然后将其转回字符串,我可以用它来更新注册表属性。

foreach ($p in $missing.path) {
    Write-Host "Searching for $p" -ForegroundColor Yellow
    $user = (Get-itemproperty -path 'HKCU:\Environment\').path -split ";"
    if ($user -contains $p) {
        Write-Host "Found in HKCU" -ForegroundColor green
        $fix = $user | Where-Object {$_ -ne $p}
        $value = $fix -join ";"
        Set-ItemProperty -Path 'HKCU:\Environment\' -Name Path -Value $value -WhatIf

    }
    $system = (Get-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment').path -split ";"
    if ($system -contains $p) {
        Write-Host "Found in HKLM" -ForegroundColor Green
        $fix = $system | Where-Object {$_ -ne $p}
        $value = $fix -join ";"
        Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' -Name Path -Value $value -WhatIf
    }
}

这绝对是您希望包含 -WhatIf 支持的代码。

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

我将生活在边缘并真正运行它。因为我的路径是特定于用户的,所以在注销并再次登录之前我不会看到更改。现在我有一个干净的 %PATH% 变量。

[玩转系统] 使用 PowerShell 进入正确的 %PATH%

包起来

与我的许多文章一样,您可能不一定需要解决此特定任务。但希望您学到了一些有关 PowerShell 的新知识,这些知识可能会在其他方面有所帮助。我将让您创建一个清理函数。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯