Compte tenu de...
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]
Je peux utiliser
Get-Item -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
qui sera de retour KeyName
, Key*Name
et Key@Name
tandis que
Get-Item -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
sera de retour juste Key*Name
. Pour l'instant, donc bon. J'ai peut-chemin ou -literalPath tant que de besoin à la recherche pour une clé avec des caractères génériques ou pas. Mais les propriétés de poser un problème.
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
fonctionne comme prévu et les retours Prop_1
& Prop_2
à partir de la KeyName
clé. Et
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
fonctionne comme prévu et retourne juste Prop_[0-9]
de la même clé. Mais tout cela ne parvient pas à part quand vous avez besoin d'utiliser un caractère générique pour trouver des propriétés, dans un chemin qui comprend un caractère générique comme un littéral dans le chemin de clé. Alors...
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]"
retourne Prop_1
& Prop_2
de tous les trois touches. Pas le comportement souhaité à tous.
J'avais espéré être en mesure de filtrer sur PSPath
aide -`literalPath " mais ce
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {$_.PSPath -match [RegEx]::Escape("Key*Name")}
ne retourne pas les bonnes propriétés. Il semble qu'un -literalPath
signifie un nom littéral, aussi. J'ai donc essayé de filtrage sur PSPath
et Name
comme
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]"))}
Mais cela ne fonctionne pas car une fois que vous obtenez en fait de biens immobiliers, ils ne sont plus un .Type de NET, ils ont chié dans un PSCustomObject
.
Et qui commence à être si compliqué, je me demande si il ya une meilleure façon de procéder. Je tiens à souligner que le but ultime ici est d'obtenir à la fois un chemin et une liste des littérale des noms de propriété, de sorte que je peux me déplacer, copier ou supprimer les propriétés. Donc, étant donné un chemin de Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name
et un nom de Prop_[0-9]
Je vais finir par envie, par exemple, supprimer
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1
&
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2
mais pas
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_[0-9]
EDIT: en Fonction de la réponse de @Tomalak j'ai simplifié un peu, pour simplement obtenir une liste de noms de propriété. Qui ressemble à ceci
$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]"}
. Maintenant, j'ai plus fins générales de l'approche. De temps à intégrer. Pour quelqu'un d'autre qui veulent le faire fonctionner,-literalPath
devrait être$keyPath
pas$key
et$keyPath
doit commencer parRegistry::
ouHKLM:
.