为什么 Test-Path 在 HKEY_LOCAL_MACHINE 上不起作用,而仅在 HKLM 上起作用:

Why does Test-Path not work on HKEY_LOCAL_MACHINE, but only HKLM:

我在 Powershell 中发现了一个看起来非常不一致和令人困惑的行为,它主要是关于访问注册表项时的不同符号,以及预期(作为参数)或传递的语法类型(作为 return value) 由各种commandlets,特别是这样的:

HKEY_LOCAL_MACHINE... 对比 HKLM:\

举个例子:

$baseDir = "HKLM:\System\CurrentControlSet\Enum\SCSI"
$Results = Get-ChildItem $baseDir -Recurse -ErrorAction SilentlyContinue

foreach ($item in $Results)
{    
    $Subkey = $item.Name
    $keyExists = Test-Path "$Subkey" -PathType Container -ErrorAction SilentlyContinue
    if ($keyExists -eq $False) 
    {
        New-Item $Subkey            
    }
}

那么会发生以下情况:

$Subkey = $item.Name

returns HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\SCSI\SomePath

$keyExists = Test-Path "$Subkey" -PathType Container -ErrorAction SilentlyContinue

无法使用该语法,即 returns "$false" 即使路径存在。

作为解决方法,我在这两行之间输入了以下代码行,解决了问题:

$Subkey = $Subkey -replace "HKEY_LOCAL_MACHINE", "HKLM:"

有效 - 它将字符串更改为: HKLM:\System\CurrentControlSet\Enum\SCSI\SomePath 所以 Test-Path 可以使用该语法,但它不是很优雅。

我到底错过了什么?为什么 powershell 不以适合在 powershell 中进一步处理的方式 return 来自 Get-ChildItem 的结果名称?为什么不总是使用相同的语法风格?

对我来说,这是 Powershell 中的一个设计缺陷,或者有任何其他方法可以解决这个问题吗?

(注意:这只是一个说明基本问题的精简示例,我知道搜索子项并检查它是否存在没有意义...)

HKLM: 是有效的 PSDrive 而 HKEY_LOCAL_MACHINE 不是。

PS C:\> <b>Get-PSProvider Registry | select -Expand Drives</b>

Name  Used (GB)  Free (GB) Provider  Root                CurrentLocation
----  ---------  --------- --------  ----                ---------------
HKLM                       Registry  HKEY_LOCAL_MACHINE
HKCU                       Registry  HKEY_CURRENT_USER

在项目的 PSPath 属性 上使用 Test-Path 而不是它们的 Name 属性.