如何检索原始的、未解析(未扩展)的注册表值?

lit*_*lit 5 registry powershell

在系统属性 > 环境变量 > 用户变量 > PATH 中包含:

%USERPROFILE%\Downloads\SysinternalsSuite;%USERPROFILE%\bin
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式检索该值:

PS C:\src\t> (Get-ItemProperty -Path HKCU:\Environment).PATH
C:\Users\lit\Downloads\SysinternalsSuite;C:\Users\lit\bin
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有变量扩展的情况下获得原始值?几乎似乎Get-ItemProperty需要一个-Raw开关。

mkl*_*nt0 7

PetSerAl与之前多次一样,在对该问题的简短评论中提供了有效的解决方案。

事实上,当前的PowerShell Get-ItemProperty/Get-ItemPropertyValue cmdlet (PowerShell 7.3.0)缺乏检索注册表值的原始值的能力REG_EXPAND_SZ,这意味着在嵌入式环境变量引用(例如,)扩展(插值)之前存储在注册表中的值。%USERPROFILE%

因此需要直接使用 .NET API:

(Get-Item -Path HKCU:\Environment).GetValue(
  'PATH',  # the registry-value name
  $null,   # the default value to return if no such value exists.
  'DoNotExpandEnvironmentNames' # the option that suppresses expansion
)
Run Code Online (Sandbox Code Playgroud)

[Microsoft.Win32.RegistryKey].GetValue()

注:由PowerShell'DoNotExpandEnvironmentNames'自动转换为;[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentVariables您也可以使用后者。