Comment utiliser la propriété Expand de PowerShell pour Select-Object

Le cmdlet Select-Object de PowerShell vous permet de choisir de manière transparente des objets et des propriétés à partir d’un groupe d’objets en entrée. Mais parfois, vous devez simplement en savoir plus. Le ExpandProperty est un commutateur pour Select-Object qui développe les détails concernant une propriété particulière.

Découvrez la puissance du commutateur PowerShell Expand Property (-ExpandProperty) dans ce tutoriel guidé par des exemples.

Prérequis

Ce tutoriel sera une démonstration pratique. Si vous souhaitez suivre, tout ce dont vous avez besoin est une machine Windows avec PowerShell 5.1 et supérieur. Cet article utilise une machine Windows 10 avec PowerShell 5.1.

Extraction des valeurs d’objet de propriété avec PowerShell Expand Property

Connectez-vous à votre machine Windows et lancez un terminal PowerShell. Dans cette section, vous vous familiariserez avec le cmdlet Select-Object et son commutateur ExpandProperty.

1. Exécutez le cmdlet Get-Service pour obtenir une liste de tous les services sur votre système. Passez la sortie au cmdlet Select-Object pour sélectionner et afficher uniquement la propriété de nom de chaque objet de service, comme illustré ci-dessous.

Get-Service | Select-Object -Property Name

Vous devriez maintenant voir une seule colonne d’objets représentant une liste de noms de services sur votre système, comme dans la capture d’écran tronquée ci-dessous.

Selecting the names of the existing system services

2. Exécutez la cmdlet Get-Member à la fin du précédent pipeline pour confirmer le type d’objets que select-object retourne comme ci-dessous. Savoir le type d’objet aide à écrire des fonctions ou des cmdlets pour étendre vos pipelines.

Get-Service | Select-Object -Property Name | Get-Member

Référez-vous à la capture d’écran ci-dessous, et vous remarquerez que bien que l’option -Property renvoie ce qui semble être une liste de chaînes, ce sont les éléments sélectionnés de objets System.ServiceProcess.ServiceController.

Viewing the type of a ServiceController object with Get-Member

3. Remplacez la cmdlet Get-Members par mkdir pour créer automatiquement un dossier pour chaque service. L’option -first 5 limite le nombre d’objets à retourner. À son tour, la fonction mkdir ne créera que cinq dossiers en fonction des objets dans le pipeline.

Get-Service | Select-Object -Property Name -First 5 | mkdir

Vous devriez voir une sortie similaire à la capture d’écran ci-dessous, indiquant la tentative réussie.

Creating a folder for the services on your system

4. Supprimez les dossiers en remplaçant mkdir par rmdir comme dans l’extrait ci-dessous. Activez l’option -Verbose pour afficher une sortie détaillée dans votre terminal.

Get-Service | Select-Object -Property Name -First 5 | rmdir -Verbose

Le cmdlet rmdir attend des chaînes de caractères et ne peut pas gérer la représentation hashtable des objets ServiceController. Votre tentative devrait échouer avec plusieurs erreurs, comme sur la capture d’écran ci-dessous.

Demonstrating that some cmdlets expect string values instead of hashtables

5. Changez l’interrupteur -Property par l’interrupteur -ExpandProperty comme dans l’extrait suivant. Cela vous permet d’obtenir la valeur d’une propriété en tant que chaîne de caractères lorsque tout ce dont vous avez besoin est une chaîne de caractères.

Get-Service | Select-Object -ExpandProperty Name -First 5 | rmdir -Verbose

Combiné avec rmdir, vous devriez voir votre tentative de suppression automatique des dossiers réussir sans erreurs, comme sur la capture d’écran ci-dessous.

Deleting folders named after the services expanded

Créer un Ensemble d’Objets Sélectionnés avec des Propriétés Spécifiques

Pour raccourcir les extraits de code dans les sections, créez une variable pour les 20 premiers services sur votre machine comme suit.

Exécutez la commande Get-Service, sélectionnez les 20 premiers objets via le cmdlet Select-Object, et stockez les objets dans une variable nommée $testServices. Sélectionnez uniquement les propriétés Name, Status, et DependentServices comme suit.

$testServices = Get-Service | Select-Object -Property Name,Status,DependentServices -First 20

L’interrupteur PowerShell Expand Property ne peut étendre qu’une propriété à la fois, contrairement à l’interrupteur Property, qui peut sélectionner plusieurs propriétés simultanément.

Exécutez le nom de variable, $testServices, pour afficher la structure de son contenu.

$testServices

Vous devriez voir un tableau affichant les propriétés des services que vous avez présélectionnés, similaire à la capture d’écran ci-dessous.

Displaying the contents of $testServices

Expansion d’une propriété de collection avec l’extension PowerShell

A PowerShell object can have properties that are collections of objects, also known as collection properties. In this section, you will learn how to use PowerShell Expand Property to expand a collection property to view its members’ properties.

Exécutez la cmdlet Select-Object sur la variable $testServices et développez la propriété DependentServices de chaque service.

$testServices | Select-Object -ExpandProperty DependentServices

Étant donné que DependentServices est une propriété de collection, la sortie est une liste des services dans toutes les collections populées, comme indiqué ci-dessous. Notez les doublons dans la liste en raison de la concaténation des résultats des DependentServices étendus.

Expanding the DependentServices property

Combinaison de propriété avec l’extension PowerShell pour une sortie catégorisée

Maintenant, vous avez une liste de services dépendants, mais comment savoir de quel service ils dépendent ? Dans cette section, vous apprendrez à utiliser l’option -Property pour catégoriser une propriété étendue.

Exécutez la commande ci-dessous pour catégoriser les propriétés DependentServices par Name.

$testServices | Select-Object -ExpandProperty DependentServices -Property Name

Étant donné que les services dépendants ont déjà une propriété Name, l’étape de catégorisation échoue, comme indiqué ci-dessous.

L’erreur ci-dessous vous indique que la liste initiale de services (dans $testServices) a déjà une propriété Name en conflit avec une propriété Name dans la propriété DependentServices étendue.

Attempting to group an expanded property by the parent object name

Un contournement consiste à créer des Propriétés Calculées pour renommer la propriété d’identifiant comme suit.

Enregistrez la sortie de la commande précédente modifiée pour spécifier une propriété calculée appelée Depends On comme la propriété d’identifiant dans une variable appelée $depServ. Depends on contiendra la valeur du nom de chaque service dans $testService.

Le nom de la propriété, Depends on, a été choisi arbitrairement dans ce didacticiel et peut être toute expression de votre choix.

$depServ = $testServices | Select-Object -ExpandProperty DependentServices -Property @{name="Depends On"; expr={$_.Name}}

Passez l’objet dans $depServ à travers Select-Object pour sélectionner les propriétés du service dépendant Name, Status et Depends On.

$depServ | Select-Object -Property Name,Status,"Depends On"

Vous pouvez maintenant dire quels services dépendent des services dans $testServices, comme indiqué ci-dessous.

Grouping an expanded property using a calculated property

Combinaison de Format-List avec PowerShell Expand Property pour la Verbosité

PowerShell peut limiter les propriétés d’objet à afficher, surtout en sortie tabulaire, et la sortie de l’interrupteur -ExpandProperty peut rencontrer le même problème. Vous pouvez afficher les propriétés étendues dans une liste plutôt que dans un tableau comme contournement.

Exécutez la cmdlet Get-Process ci-dessous pour récupérer tous les modules que le processus explorer utilise. Activez l’interrupteur -ExpandProperty pour afficher les propriétés des modules.

Get-Process explorer | select-object -ExpandProperty Modules

La sortie sur votre écran devrait ressembler à la capture d’écran suivante, automatiquement tronquée pour afficher uniquement trois propriétés.

Viewing the truncated output of an expanded property

Pipez les objets vers la cmdlet Format-List pour afficher toutes les valeurs des objets de module dans une liste plus gérable.

Get-Process explorer | select-object -ExpandProperty Modules | Format-List

Comme indiqué ci-dessous, la sortie répertorie toutes les propriétés et leurs valeurs. Vous pouvez ensuite sauvegarder les données dans un fichier ou les transmettre à une autre cmdlet pour un traitement ultérieur.

Converting the output of an expanded property to a list with Format-List

Conclusion

En parvenant jusqu’ici avec succès, vous avez vu comment tirer parti de l’interrupteur de propriété PowerShell (-ExpandProperty) de la cmdlet Select-Object. PowerShell propose une multitude de cmdlets utiles pour de nombreuses tâches courantes. Vous pouvez enrichir vos nouvelles connaissances en apprenant comment afficher rapidement des fichiers avec PowerShell Cat.

Source:
https://adamtheautomator.com/powershell-expand-property/