Powershell, du registre et des caractères génériques, oh mon

0

La question

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

La meilleure réponse

2

Cela permet d'obtenir une clé de registre par chemin littéral du filtre et de ses propriétés par regex match

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

Au lieu de la $key.Name bien sûr, vous pouvez retourner le réel $key si c'est plus pratique pour votre tâche.

2021-11-16 10:57:44

J'avais juste réussi à obtenir quelque chose à travailler, à savoir 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 $keyet $keyPath doit commencer par Registry:: ou HKLM:.
Gordon

@Gordon Vous avez raison, ceux qui ont été les oublis quand j'ai traduit mon code de test. Fixe.
Tomalak

Pas de soucis. C'était en fait très bon pour moi de vraiment besoin de comprendre votre démarche pour le faire fonctionner. La meilleure façon d'apprendre. :) Vraiment heureux d'avoir une meilleure approche, en général, pour traiter avec PSCustomObject un type de retour trop.
Gordon

@Gordon Il y a toujours plus d'une façon avec PowerShell.
Tomalak

TRÈS vrai, que. :)
Gordon

Dans d'autres langues

Cette page est dans d'autres langues

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