gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:42:14 25 4
gpt4 key购买 nike

我在 Powershell 中发现了一个看起来非常不一致和令人困惑的行为,它主要是关于访问注册表项时的不同符号,以及期望(作为参数)或传递(作为返回值)的语法类型通过各种 commandlet,尤其是这样的:

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:\System\CurrentControlSet\Enum\SCSI\SomePath所以 Test-Path 可以使用该语法,但它不是很优雅。

我到底错过了什么?为什么 powershell 不以适合在 powershell 中进一步处理的方式从 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 - 为什么 Test-Path 在 HKEY_LOCAL_MACHINE 上不起作用,而只在 HKLM : 上起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27837226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com