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*Name и Key@Name, в то время как

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

вернется только Key*Name. Пока все идет хорошо. Я могу использовать-path или -LiteralPath по мере необходимости для поиска ключа с подстановочными знаками или без них. Но свойства создают проблему.

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

работает так, как ожидалось, и возвращается Prop_1 & Prop_2 из KeyName Клавиша. И

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 используя -`буквальный путь', но это

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

не возвращает правильные свойства. Похоже, что а -literalPath означает также буквальное имя. Поэтому я попробовал фильтровать на PSPath и Name вот так

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]"))}

Но это не работает, потому что, как только вы действительно получаете реальные свойства, они больше не относятся к типу .NET, они были превращены в 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

Это позволит получить раздел реестра по буквальному пути и отфильтровать его свойства по соответствию регулярному выражению

$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

@Гордон С PowerShell всегда есть несколько способов.
Tomalak

ОЧЕНЬ верно, что. :)
Gordon

На других языках

Эта страница на других языках

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