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>