Podane...
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]
Mogę użyć
Get-Item -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
który wróci KeyName
, Key*Name
i Key@Name
, podczas gdy
Get-Item -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
wróci dopiero Key*Name
. Jak na razie wszystko idzie dobrze. Mogę użyć-path lub -LiteralPath w razie potrzeby do wyszukiwania klucza przy użyciu symboli wieloznacznych lub bez nich. Ale właściwości stwarzają problem.
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
działa tak, jak powinno, i wraca Prop_1
& Prop_2
z KeyName
Klawisz. I
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
działa tak, jak powinno, i powraca po prostu Prop_[0-9]
z tego samego klucza. Ale wszystko to nie udać, jeśli trzeba użyć symbolu wieloznacznego dla wyszukiwania nieruchomości w drodze, który zawiera symbolem wieloznacznym jako literału w drodze do klucza. Tak...
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]"
ZWROT Prop_1
& Prop_2
od wszystkich trzech kluczy. Nie pożądane zachowania.
Miałem nadzieję, że będę w stanie odfiltrować PSPath
za pomocą -`dosłowne drogę', ale to
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {$_.PSPath -match [RegEx]::Escape("Key*Name")}
nie zwraca odpowiednie właściwości. Wygląda na to, że a -literalPath
oznacza również dosłowne imię. Dlatego próbowałem filtrować PSPath
i Name
tak
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]"))}
Ale to nie działa, bo jak tylko masz naprawdę prawdziwe właściwości, oni nie należą do typu .NET, zostały przekształcone w PSCustomObject
.
I to zaczyna się tak skomplikowane, że zastanawiam się, czy jest lepszy sposób, aby kontynuować. Muszę podkreślić, że ostatecznym celem jest tu zdobycie jak dosłowny sposób, więc i lista liter nazw właściwości, żebym mógł przenosić, kopiować lub usuwać właściwości. Tak więc, biorąc pod uwagę sposób Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name
i nazwa Prop_[0-9]
W końcu będę chciał, na przykład, usunąć
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1
&
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2
ale nie
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_[0-9]
EDIT: na Podstawie odpowiedzi @Tomalak, jestem trochę uproszczone, aby uzyskać listę nazw atrybutów. To wygląda tak
$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]"}
. Teraz mam podejście bardziej ogólnego przeznaczenia. Nadszedł czas, aby się integrować. Dla wszystkich, którzy chcą, aby to zadziałało-literalPath
powinno być$keyPath
nie$key
i$keyPath
trzeba zacząć odRegistry::
lubHKLM:
.