在 powershell 脚本中引用默认路径

Reference default path in powershell script

如果当前终端中的路径已经改变,有没有办法调用系统路径?即:

$env:Path = "C:\some new path"   
#some coding that requires a different path set up
$env:Path = $defaultPath #would have to define $defaultPath by calling the system default path

它仍然存储在注册表中,因此您可以查询它:

  • 位于:HKLM:\System\CurrentControlSet\Control\Session Manager\Environment
$key = "HKCU:\Environment",
       "HKLM:\System\CurrentControlSet\Control\Session Manager\Environment"
       
(Get-ItemPropertyValue -Path $key -Name Path) -Join ';'

使用 Get-ItemPropertyValue 查询密钥(Mklement 所建议)将为您提供 属性' s 值.

使用以下命令从注册表重新加载 $env:PATH 环境变量,因为 未来 会话会看到它(假设没有进行进一步的相关注册表更新)。

如果您当前的会话没有进行任何相关的注册表更新,这与获取在会话启动时生效的值相同 - 除非通过 $PROFILE script:[=24= 进行任何动态添加]

$env:PATH = [Environment]::GetEnvironmentVariable('Path', 'Machine'),
            [Environment]::GetEnvironmentVariable('Path', 'User') -join ';'

注:

  • 进程的有效$env:PATH值是machine-level[=53=的复合值] 和 user-level 注册表项,machine-level 定义优先,如上面两个 .NET API 调用所示。

    • 请注意,基础注册表位置 - HKEY_LOCAL_MACHIN\System\CurrentControlSet\Control\Session Manager\EnvironmentHKEY_CURRENT_USER\Environment - 是 REG_EXPAND_SZ 注册表值,即它们可以根据 other 环境变量,例如%SystemRoot%%ProgramFiles%.

    • 上面的 .NET API 调用 - 使用 [Environment]::GetEnvironmentVariable() - and PowerShell's Get-ItemProperty and Get-ItemPropertyValue cmdlet expand(插入)此类引用和 return 逐字 路径 - 这也是新进程默认看到的路径。

  • 鉴于上述情况,稳健地检索在会话启动时生效的值的唯一方法是将其保存在启动时的变量