我在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中的设计缺陷,还是有其他方法可以解决这个问题?
(注意:这只是一个显示基本问题的精简示例,我知道搜索子项并检查它的存在是没有意义的......)
答案 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
属性。