为什么 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
属性.
我在 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
属性.