Powershell, rejestr i symboli wieloznacznych, o boże

0

Pytanie

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})
powershell registry wildcard
2021-11-16 08:27:28
1

Najlepsza odpowiedź

2

Pozwoli to uzyskać klucz rejestru dla dosłownego drodze i filtrować jego właściwości dopasowania wyrażenia regularnego

$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
        }
    }
}

Zamiast $key.Name można oczywiście oddać rzeczywisty $key jeśli jest to bardziej wygodne dla danego zadania.

2021-11-16 10:57:44

Mi właśnie udało się sprawić, że coś działać, a mianowicie 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 $keyi $keyPath trzeba zacząć od Registry:: lub HKLM:.
Gordon

@Gordon, Masz rację, to były zaniedbania, kiedy tłumaczyłem swój testowy kod. Naprawiono.
Tomalak

Nie martw się. Właściwie było mi bardzo pomocne w pełni zrozumieć twoje podejście, aby zmusić go do pracy. Najlepszy sposób na naukę. :) Naprawdę miło mieć najlepsze podejście w ogóle do pracy z PSCustomObject jako zwracanego typu też.
Gordon

@Gordon Z PowerShell zawsze jest kilka sposobów.
Tomalak

BARDZO prawdziwe, że. :)
Gordon

W innych językach

Ta strona jest w innych językach

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