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@Name
mentre
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})
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$key
e$keyPath
deve iniziare conRegistry::
oHKLM:
.