Powershell、登记和通配符的,噢,我的

0

的问题

给予...

HKLM\Software\   
  KeyName
    Property_1
    Property_2
    Property_[0-1] 
  Key*Name
    Property_1
    Property_2
    Property_[0-1]   
  Key@Name
    Property_1
    Property_2
    Property_[0-1]

我可以使用

Get-Item -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"

这将返回 KeyName, Key*NameKey@Name同时

Get-Item -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"

将返回刚刚 Key*Name. 到目前为止,一切都很好. 我可以使用的道路或literalPath根据需要搜索的关键用通配符或者没有。 但性质构成一个问题。

Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"

作为预期和返回 Prop_1 & Prop_2KeyName 关键。 和

Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"

作为预期和返回的只是 Prop_[0-9] 从相同的密钥。 但是这一切都失败时除了当你需要使用通配符找到的属性,在一个路径,包括通配符作为一个文本在关键路径。 所以...

Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]"

返回 Prop_1 & Prop_2 从所有三个钥匙。 不是所期望的行为。

我曾希望能够过滤器上 PSPath 使用`literalPath'但是这

Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {$_.PSPath -match [RegEx]::Escape("Key*Name")}

不返回的正确性。 它似乎是一个 -literalPath 意味着一种文字的名称。 所以我试着过滤 PSPathName 就像这样

Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {(($_.PSPath -match [RegEx]::Escape("Key*Name")) -and ($_.Name -match "Prop_[0-9]"))}

但是,这并不工作,因为一旦你实际上得到实性质,他们不再是一个.净类型,它们已经被拉入 PSCustomObject. 这开始变得这么复杂,我不知道,如果有一个更好的方式进行。 我应该注意,最终目标是获得一个文本路径和列表的文本酒店的名字,所以,我可以移动,复制或删除的性质。 因此,鉴于道路 Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name 和一个名字 Prop_[0-9] 我最终想要的,例如,删除

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1 

&

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2

但不是

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_[0-9]

编辑:基于的答案,从@Tomalak我已简化了一点,简单地得到回财产清单的名字。 看起来像这样

$keyPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
$propExpr = "Prop_[0-9]"
((Get-Item -literalPath:$keyPath | Get-ItemProperty).PSObject.Properties | Where-Object Name -Match $propExpr | ForEach-Object {$_.Name})
powershell registry wildcard
2021-11-16 08:27:28
1

最好的答案

2

这将得到一个注册表的关键的文字路径和过滤其特性通过regex匹配

$keyPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
$propExpr = "Prop_[0-9]"

Get-Item -literalPath $keyPath -PipelineVariable key | Get-ItemProperty | ForEach-Object {
    $_.PSObject.Properties | Where-Object Name -Match $propExpr | ForEach-Object {
        [pscustomobject]@{
            key = $key.Name
            prop = $_.Name
            value = $_.Value
        }
    }
}

而不是的 $key.Name 你当然可以返回的实际 $key 如果这是更便于你的任务。

2021-11-16 10:57:44

我刚刚设法让一些工作,即 Get-Item -literalPath 'HKLM:\SOFTWARE\Key*Name\' | Select-Object -ExpandProperty property | Where {$_ -match "Prop_[0-9]"}. 现在我有一个更通用的方法。 时间的整合。 任何人都别想,使它的工作, -literalPath$keyPath$key$keyPath 需要开始 Registry::HKLM:.
Gordon

@戈登你是对的,那些被疏忽,当我翻译我的测试代码。 固定的。
Tomalak

没有后顾之忧。 它实际上真的很好我需要真正了解你的方法让它工作。 最好的学习方法。 :)真的很高兴有一个更好的方法在一般处理 PSCustomObject 作为回报类型。
Gordon

@Gordon总是有一个以上的方式配置。
Tomalak

非常真实的,这一点。 :)
Gordon

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................