6
votes

Comment filtrer les paires de noms / valeur sous une clé de registre par nom et valeur dans PowerShell?

J'essaie d'avoir une idée des idioms à utiliser dans PowerShell.

Compte tenu de ce script: xxx

i obtenir la sortie au bas de cette Question.

J'aimerais obtenir la sortie des propriétés (nom de nom / valeur sous la touche $ ) où je peux filtrer sur le nom et la valeur.

Par exemple, filtrer pour répertorier toutes les extensions qui ont:

  • nom comme xls *
  • ou valeur comme * \ msaccess.exe

    ou un filtre d'exclusion: excluez tous les noms tels que doc *

    sapin Le premier filtre, je voudrais un résultat comme celui-ci: xxx

    Il s'agit de la sortie d'origine du script: xxx

    edit

    J'ai résolu une partie du problème: obtenir une liste de paires de noms / valeur. Il utilise PSCustomObject : xxx

    (Comment dois-je envelopper ce code?)

    Toute aide avec le filtrage serait très apprécié


0 commentaires

3 Réponses :


6
votes

une réponse à deux parties.

Nous commençons par la touche $ $> à partir du registre: p> xxx pré>

depuis $ clé est un Microsoft.win32.registrykekey , vous ne pouvez pas obtenir directement la valeur de valeur directement. p>

La première étape consiste à créer une liste de PSCustomObjects avec Nom code> / Valeur code> paires. Le nom code> est issu du GetValuenames PIGNED via un foreach-objet . Pour chacun de ces noms, nous obtenons la valeur code> via GetValue : p>

Name    Value                                                                                         
----    -----                                                                                         
xlsx    C:\PROGRA~2\MICROS~1\Office15\EXCEL.EXE                                                       
xls     C:\PROGRA~2\MICROS~1\Office15\EXCEL.EXE                                                       
mdb     C:\PROGRA~2\MICROS~1\Office15\MSACCESS.EXE                                                    
mda     C:\PROGRA~2\MICROS~1\Office15\MSACCESS.EXE


0 commentaires

5
votes

Il y a un moyen beaucoup plus intelligent pour énumérer les valeurs de registre (trouvé Ici ). Et c'est plus de PowerShell-Way imo.

Je l'ai transformé en une doublure: xxx

mise à jour: Comme indiqué dans les commentaires par @ mklement0, vous devez faire attention aux propriétés pspath , psparentpath , pschildname , PSDRive et Psprovider dans le psobject.properties .


4 commentaires

Merci. Je n'ai jamais entendu parler de la propriété psobject car il ne figure pas avec get-member , mais apparemment, il est masqué car il est présent sur n'importe quel objet PowerShell. Appris une belle nouvelle chose aujourd'hui. +1 et accepté.


Bien fait; @ Jeroenwiertertpluimers: Pour faire Get-Member Afficher les membres normalement masqués, utilisez le commutateur -force . Oui, .psObject est disponible sur n'importe quel objet de PowerShell et est une source de réflexion riche.


Aussi pratique et concis que cette solution est, il existe un piège: le fournisseur de registre de PowerShell ajoute automatiquement ses propres propriétés à la collection de propriétés signalées dans .psobject.properties , nommément pspath , psparentpath , pschildname , psDrive et psprovider , ce qui signifie qu'une expression générique qui filtre par nom peut accidentellement Incluez-les ou, pire, si les valeurs du même nom sont arrivées sur la clé (même si peu probable), les propriétés du fournisseur les remplacent.


@ mklement0 bel addition. Mais je crois que cette question est un prix abordable pour une commodité.



2
votes

A ROBUST ROBUST PSV4 + alternative à Réponse utile de Montonero : [1] xxx

  • -PipelineVariable Key stocke le [Microsoft.win32.registry] instance renvoyée par Obtenir l'élément dans la variable $ clé pour une utilisation ultérieure dans le pipeline.

  • foreach-objet Propriété énumère les noms de valeur de la clé cible (via la propriété .property NOTE POWERSHELL ajoute à la sortie [Microsoft.win32 .Registrykey] instance).

  • à l'intérieur du bloc où-objet bloc de script, $ _ désigne ensuite le nom de la valeur à la main et $ key.gevalue () est utilisé pour extraire les données associées.

    • important : dans le tableau .property , PowerShell Traduit le nom de valeur par défaut , qui est la chaîne vide ( '' ') au niveau de l'API, dans le nom ' (par défaut) '; Ainsi, si $ _ est '(par défaut)' ', vous devez le traduire en ' '' avant d'appeler $ _. getvalue ( ) , lequel est ce que ($ _, '') [$ _ -eq '(par défaut)'] fait.
    • [pscustomobject] @ {...} puis construit et sortit un [pscustomObject] instance avec nom et < code> .value Propriétés reflétant le nom et les données de la valeur correspondante.


      [1] La réponse de Montonero est concise et fonctionne bien dans l'affaire à portée de main, Mais il est livré avec des mises en garde:

      Le fournisseur de registre de PowerShell ajoute automatiquement les propriétés de note supplémentaires suivantes (membres de type noteProperty , comme indiqué dans la sortie de < Code> Get-Member ) contenant métadata sur les clés de registre ciblées à la [pscustomObject] instance get-itemproperty Sorties :

      • pspath , psparentpath , pschildname , psDrive , psprovider

        Ceux-ci peuvent interférer avec filtrage en fonction de .psobject.properties de deux manières:

        • Utilisation de la correspondance générique contre € _. Nom peut inclure accidentellement ces propriétés.

          • par exemple, $ _. Nom -lique '* lecteur *' ' correspondrait à la propriété PSDRive , même si cela ne fait pas partie de la clé de registre. < / li>
          • Peut-être plus hypothétiquement, si la clé de registre a eu des valeurs du même nom que ces propriétés de fournisseur, les propriétés du fournisseur shadow (remplacement) ces valeurs.

            • E.g., Si la clé dispose d'une valeur pspath , $ _. Valeur signalera la valeur de la propriété fournisseur . .

0 commentaires