Dat...
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]
Pot folosi
Get-Item -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
care va reveni KeyName
, Key*Name
și Key@Name
, în timp ce
Get-Item -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
va reveni doar Key*Name
. Până în prezent, atât de bine. Pot folosi -cale sau -literalPath după cum este necesar să fie căutarea pentru o cheie cu metacaractere sau nu. Dar proprietăților reprezintă o problemă.
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
funcționează cum era de așteptat și se întoarce Prop_1
& Prop_2
din KeyName
cheie. Și
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
funcționează cum era de așteptat și se întoarce doar Prop_[0-9]
din aceeași cheie. Dar tot nu în afară, atunci când aveți nevoie pentru a folosi un wildcard pentru a găsi proprietăți, pe un traseu care include un metacaracter ca un literal în calea cheie. Deci...
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]"
se întoarce Prop_1
& Prop_2
din toate cele trei chei. Nu comportamentul dorit la toate.
Am sperat să fie capabil de a filtra pe PSPath
folosind -`literalPath' dar acest
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {$_.PSPath -match [RegEx]::Escape("Key*Name")}
nu se întoarce proprietățile corecte. Se pare că o -literalPath
înseamnă literal numele, de asemenea,. Așa că am încercat filtrare pe PSPath
și Name
ca asa
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]"))}
Dar asta nu funcționează pentru că odată ce veți obține de fapt, proprietăți reale, ele nu mai sunt .NET tip, au fost de cacat intr-o PSCustomObject
.
Și că începe să fie atât de complicat mă întreb dacă nu există o modalitate mai bună de a continua. Eu ar trebui să rețineți că scopul final este de a obține atât un literal cale și o listă de literal nume de proprietăți, astfel încât să pot muta, copia sau șterge proprietăți. Deci, având o cale de Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name
și un nume de Prop_[0-9]
Am în cele din urmă va dori să, de exemplu, șterge
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1
&
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2
dar nu
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_[0-9]
EDIT: Bazat pe răspunsul de la @Tomalak am simplificat un pic, pentru a obține pur și simplu o listă de nume de proprietăți. Care arata ca acest lucru
$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]"}
. Acum am o mai mult cu scop general de abordare. Timp să se integreze. Pentru oricine altcineva care doresc pentru a face să funcționeze,-literalPath
ar trebui să fie$keyPath
nu$key
și$keyPath
trebuie să înceapă cuRegistry::
sauHKLM:
.