Powershell, de registry și metacaractere, oh mea

0

Problema

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

Cel mai bun răspuns

2

Acest lucru va primi o cheie de registry de literal calea și filtru de proprietățile sale de regex meci

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

În loc de $key.Name desigur, puteți reveni la real $key cazul în care este mai convenabil pentru sarcina ta.

2021-11-16 10:57:44

Tocmai reușit pentru a obține ceva de lucru, și anume 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ă cu Registry:: sau HKLM:.
Gordon

@Gordon Ai dreptate, cei care au fost scapari când am tradus-mi codul de testare. Fix.
Tomalak

Nu vă faceți griji. De fapt a fost foarte bine pentru mine să nevoie pentru a înțelege abordarea dvs. pentru a face să funcționeze. Cel mai bun mod de a învăța. :) Foarte fericit să aibă o mai bună abordare, în general, pentru a face cu PSCustomObject ca tip de retur prea.
Gordon

@Gordon Există întotdeauna mai mult de un mod cu PowerShell.
Tomalak

FOARTE adevărat, că. :)
Gordon

În alte limbi

Această pagină este în alte limbi

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