Powershell, registro di sistema e i caratteri jolly, oh mio

0

Domanda

Dato...

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]

Posso usare

Get-Item -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"

che tornerà KeyName, Key*Name e Key@Namementre

Get-Item -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"

tornerà solo Key*Name. Così lontano, così buono. Posso usare il percorso o -literalPath come necessario per la ricerca di una chiave con caratteri jolly o non. Ma la proprietà costituisce un problema.

Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"

funziona come previsto e restituisce Prop_1 & Prop_2 dal KeyName chiave. E

Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"

funziona come previsto e restituisce solo Prop_[0-9] dalla stessa chiave. Ma non riesce a parte quando è necessario utilizzare un carattere jolly per trovare proprietà, in un percorso che include un carattere jolly come un letterale nel percorso della chiave. Quindi...

Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]"

restituisce Prop_1 & Prop_2 da tutte e tre le chiavi. Non è il comportamento desiderato a tutti.

Avevo sperato di essere in grado di filtrare PSPath utilizzando -`literalPath', ma questo

Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {$_.PSPath -match [RegEx]::Escape("Key*Name")}

non restituisce le proprietà corrette. Sembra che un -literalPath significa, letteralmente, una anche il nome. Così ho provato il filtro su PSPath e Name come

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]"))}

Ma questo non funziona, perché una volta che si ottiene effettivamente reale, proprietà, non sono più di una .NET, sono stati shat in un PSCustomObject. E che sta cominciando a essere così complicato mi chiedo se c'è un modo migliore di procedere. Vorrei sottolineare che lo scopo qui è quello di ottenere sia un percorso letterale e un elenco di letterale nomi di proprietà, in modo che posso spostare, copiare o eliminare la proprietà. Quindi, dato un percorso di Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name e un nome di Prop_[0-9] Io alla fine voglio, per esempio, eliminare

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1 

&

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2

ma non

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_[0-9]

EDIT: in Base alla risposta da @Tomalak ho semplificato un po', semplicemente per ottenere un elenco di nomi di proprietà. Che assomiglia a questo

$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

Migliore risposta

2

Questo permette di ottenere una chiave del registro di sistema letterale percorso di filtro e di sua proprietà da regex partita

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

Invece di $key.Name ovviamente si può restituire il valore effettivo di $key se è più conveniente per la tua attività.

2021-11-16 10:57:44

Ero appena riuscito a ottenere qualcosa di lavoro, vale a dire Get-Item -literalPath 'HKLM:\SOFTWARE\Key*Name\' | Select-Object -ExpandProperty property | Where {$_ -match "Prop_[0-9]"}. Ora ho una fine più generale approccio. Il tempo di integrare. Per chiunque altro, la voglia di fare il lavoro, -literalPath dovrebbe essere $keyPath non $keye $keyPath deve iniziare con Registry:: o HKLM:.
Gordon

@Gordon Hai ragione, queste sono state sviste quando ho tradotto il mio codice di prova. Risolto.
Tomalak

Nessuna preoccupazione. E ' stata davvero buona per me necessario per capire davvero il tuo approccio per farlo funzionare. Modo migliore per imparare. :) Veramente felice di avere un approccio migliore, in generale, per affrontare con PSCustomObject come tipo di ritorno troppo.
Gordon

@Gordon C'è sempre più di un modo con PowerShell.
Tomalak

MOLTO vero, che. :)
Gordon

In altre lingue

Questa pagina è in altre lingue

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