Дано...
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})
Get-Item -literalPath 'HKLM:\SOFTWARE\Key*Name\' | Select-Object -ExpandProperty property | Where {$_ -match "Prop_[0-9]"}
. Теперь у меня есть подход более общего назначения. Пришло время интегрироваться. Для всех, кто хочет, чтобы это сработало,-literalPath
должно быть$keyPath
нет$key
, и$keyPath
нужно начать сRegistry::
илиHKLM:
.