为什么Test-Path不适用于HKEY_LOCAL_MACHINE,而只适用于HKLM:

时间:2015-01-08 09:54:19

标签: powershell syntax registry

我在Powershell中发现了一个看起来非常不一致并且让我感到困惑的行为,主要是访问注册表项时的不同符号,以及期望的语法(作为参数)或传递(作为返回值)通过各种命令行开关,特别喜欢这个:

... 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

返回 HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Enum \ SCSI \ SomePath

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

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

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

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

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

我究竟错过了什么?为什么powershell不以适合在PowerShell中进一步处理的方式从Get-ChildItem返回Result-names?为什么不总是使用相同的语法风格?

对我而言,这是Powershell中的设计缺陷,还是有其他方法可以解决这个问题?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

在项目'上使用Test-Path PSPath属性而不是Name属性。