J'essaie d'avoir une idée des idioms à utiliser dans PowerShell.
Compte tenu de ce script: p> i obtenir la sortie au bas de cette Question. P> J'aimerais obtenir la sortie des propriétés (nom de nom / valeur sous la touche Par exemple, filtrer pour répertorier toutes les extensions qui ont: p> ou un filtre d'exclusion: excluez tous les noms tels que sapin Le premier filtre, je voudrais un résultat comme celui-ci: P> Il s'agit de la sortie d'origine du script: p> edit forte> p> J'ai résolu une partie du problème: obtenir une liste de paires de noms / valeur. Il utilise PSCustomObject : p> (Comment dois-je envelopper ce code?) P> Toute aide avec le filtrage serait très apprécié p> p> $ code>) où je peux filtrer sur le nom et la valeur. P >
xls * code> li>
* \ msaccess.exe code> li>
ul> doc * code> p>
3 Réponses :
une réponse à deux parties.
Nous commençons par la touche depuis La première étape consiste à créer une liste de PSCustomObjects avec $ $> à partir du registre: p> $ clé est un Microsoft.win32.registrykekey , vous ne pouvez pas obtenir directement la valeur de valeur directement. p> 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
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: p> pspath code>, psparentpath code>, pschildname code>, PSDRive code> et Psprovider code> dans le psobject.properties code>. P> p>
Merci. Je n'ai jamais entendu parler de la propriété psobject code> car il ne figure pas avec get-member code>, 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 code> Afficher les membres normalement masqués, utilisez le commutateur -force code>. Oui, .psObject code> 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 code>, nommément pspath code> , psparentpath code>, pschildname code>, psDrive code> et psprovider code>, 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é.
A à l'intérieur du bloc [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: p> Le fournisseur de registre de PowerShell ajoute automatiquement les propriétés de note supplémentaires suivantes forte> (membres de type Ceux-ci Utilisation de la correspondance générique contre 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 em> (remplacement) ces valeurs. P>
-PipelineVariable Key code> stocke le [Microsoft.win32.registry] code> instance renvoyée par Obtenir l'élément code> dans la variable $ clé code> pour une utilisation ultérieure dans le pipeline. p> li>
foreach-objet Propriété code> énumère les noms de valeur de la clé cible (via la propriété .property code> NOTE POWERSHELL ajoute à la sortie [Microsoft.win32 .Registrykey] code> instance). P> li>
où-objet code> bloc de script, $ _ code> désigne ensuite le nom de la valeur à la main et $ key.gevalue (
.property code>, PowerShell Traduit le nom de valeur '' ' code>) au niveau de l'API, dans le nom ' (par défaut) ' code>; Ainsi, si $ _ code> est '(par défaut)' ' code>, vous devez le traduire en ' '' code> avant d'appeler $ _. getvalue ( ($ _, '') [$ _ -eq '(par défaut)'] li> fait. LI>
ul> li>
[pscustomobject] @ {...} code> puis construit et sortit un [pscustomObject] code> instance avec
noteProperty code>, comme indiqué dans la sortie de < Code> Get-Member CODE>) contenant métadata em> sur les clés de registre ciblées [pscustomObject] code> instance get-itemproperty code > Sorties strong>: p>
pspath code>, psparentpath code>, pschildname code>, psDrive code>, psprovider code> li >
ul> .psobject.properties code> strong> de deux manières: p>
€ _. Nom code> peut inclure accidentellement ces propriétés. P>
$ _. Nom -lique '* lecteur *' ' code> correspondrait à la propriété PSDRive code>, même si cela ne fait pas partie de la clé de registre. < / li>
ul> li>
$ _. Valeur code> signalera la valeur de la propriété fournisseur em>. li>. LI>
ul> li>
ul> p>