Maîtriser PowerShell Where-Object : Un guide complet

Lorsque vous travaillez avec les valeurs de propriété PowerShell dans une collection d’objets, parfois vous aurez besoin d’un moyen de filtrer tout ce dont vous n’avez pas besoin. Savoir comment utiliser la cmdlet PowerShell Where-Object est une compétence importante à avoir dans votre boîte à outils PowerShell.

La cmdlet Where-Object est un moyen pratique de filtrer des objets. Dans ce tutoriel, vous apprendrez différentes façons de construire une commande Where-Object, ses paramètres disponibles, sa syntaxe, ainsi que comment utiliser des conditions multiples comme un pro!

Prérequis

Il n’y a qu’une seule condition préalable pour cet article. Vous devez avoir une certaine familiarité avec les commandes et la syntaxe PowerShell.

Tous les exemples dans cet article seront basés sur la version stable actuelle de PowerShell (7.1.0 au moment de la rédaction). Mais tant que vous avez PowerShell 4.0 et supérieur, les commandes fonctionneront de la même manière.

Comprendre Comment Fonctionne Where-Object de PowerShell

Le seul but de la cmdlet PowerShell Where-Object est de filtrer la sortie qu’une commande retourne pour ne renvoyer que les informations que vous voulez voir.

En résumé, la cmdlet Where-Object est un filtre ; c’est tout. Elle vous permet de construire une condition qui renvoie Vrai ou Faux. Selon le résultat de cette condition, la cmdlet renvoie ensuite la sortie ou non.

Vous pouvez formuler cette condition de deux manières : la « vieille » méthode avec des blocs de script et la « nouvelle » méthode en utilisant des paramètres ou des instructions de comparaison.

Création de conditions de filtrage avec des blocs de script

Les blocs de script sont un composant clé de PowerShell. Ils sont utilisés à de nombreux endroits dans le langage. Un bloc de script est une fonction anonyme. C’est une manière de compartimenter le code et de l’exécuter à différents endroits. Vous pouvez construire un filtre pour Where-Object via un bloc de script.

Pour utiliser un bloc de script comme filtre, vous utiliseriez le paramètre FilterScript. Ce paramètre vous permet de créer et de transmettre un bloc de script au paramètre FilterScript qui est ensuite exécuté.

Si le bloc de script renvoie une valeur autre qu’un booléen False ou une variable nulle, elle est considérée comme True. Sinon, elle est considérée comme False.

Par exemple, disons que vous devez trouver tous les services Windows qui ont actuellement un type de démarrage Automatique. Vous rassembleriez d’abord tous les services actuels avec Get-Service. Get-Service renvoie alors de nombreux objets de service différents avec diverses propriétés.

En utilisant le pipeline PowerShell, vous pourriez ensuite rediriger ces objets vers la cmdlet Where-Object et utiliser le paramètre FilterScript. Étant donné que le paramètre FilterScript accepte un scriptblock, vous pourriez créer une condition pour vérifier si la propriété StartType de chaque objet est égale à Automatic comme ci-dessous.

{$_.StartType -EQ 'Automatic'}

Une fois que vous avez le scriptblock de filtrage, vous fourniriez ensuite ce scriptblock au paramètre FilterScript. Where-Object exécuterait alors ce scriptblock pour chaque objet passant par le pipeline et évaluerait chaque propriété StartType. Si la propriété est égale à Automatic, Where-Object transmettrait l’objet. Sinon, l’objet serait ignoré.

Vous pouvez voir un exemple simple de cette méthodologie ci-dessous.

Get-Service | Where-Object -FilterScript {$_.StartType -EQ 'Automatic'}
Script Block construct

De nombreuses personnes utilisent des paramètres positionnels avec la cmdlet Where-Object et n’incluent pas le nom du paramètre FilterScript. Au lieu de cela, elles fournissent simplement le scriptblock seul, comme Where-Object {$_.StartType -eq 'Automatic'}.

Bien que ce type de construction fonctionne pour ce scénario particulier, le concept d’un scriptblock avec les accolades ou même le variable de pipeline $_ rend le code moins lisible et plus difficile pour les utilisateurs PowerShell moins expérimentés. Ce problème de lisibilité est ce qui a poussé l’équipe PowerShell à introduire des paramètres ou des déclarations de comparaison.

Comparaisons

Introduit dans Windows PowerShell 3.0, les déclarations de comparaison ont une structure plus naturelle dans leur construction. En utilisant le même scénario que dans l’exemple précédent, utilisons la structure de déclaration de comparaison pour trouver tous les services Windows avec un type de démarrage Automatique:

Get-Service | Where-Object -Property StartType -EQ 'Automatic'

Remarquez ci-dessus qu’au lieu d’utiliser un bloc de script, la commande spécifie la propriété de l’objet en tant que valeur de paramètre pour le paramètre Propriété. L’opérateur eq est maintenant également un paramètre vous permettant de lui transmettre la valeur Automatique.

En utilisant les paramètres de cette manière, il est désormais inutile d’avoir un bloc de script.

A scriptblock is a better choice when defining more complex filtering conditions. The Property parameter may not always be the best choice. If using a scriptblock, just remember to document your code using comments!

Dans la section suivante, vous découvrirez les types d’opérateurs de comparaison disponibles qui peuvent être utilisés avec Where-Object pour filtrer toutes les choses.

Fondamentaux du Filtrage

En utilisant des paramètres, Where-Object filtre des collections d’objets en utilisant des opérateurs de comparaison courants. Plongeons dans quelques exemples de leur fonctionnement.

Opérateurs de Contenance

Les opérateurs de contenance sont utiles lorsqu’on travaille avec des collections. Ils permettent de définir une condition si une collection contient un élément ou non.

Par exemple, disons que vous voulez filtrer une valeur de propriété particulière dans une collection. Vous pourriez utiliser des opérateurs de contenance.

En PowerShell, vous trouverez quelques opérateurs de contenance différents:

  • -contains / -ccontains – Filtre une collection contenant une valeur de propriété.
  • -notcontains / -cnotcontains – Filtrer une collection qui ne contient pas une valeur de propriété.
  • -in / -cin – la valeur est dans une collection, renvoie la valeur de la propriété si une correspondance est trouvée.
  • -notin / -cnotin – la valeur n’est pas dans une collection, null/$false s’il n’y a pas de valeur de propriété.

Pour la sensibilité à la casse, utilisez des opérateurs de contenance qui commencent par -c[operator]

Connexe: Comprendre les opérateurs de comparaison PowerShell par l’exemple

Supposons que vous vouliez vérifier l’état du service Windows BITS. Vous pouvez le faire en utilisant le paramètre (opérateur) contains en lui passant la valeur de BITS comme ci-dessous.

Get-Service | Where-Object -Property Name -Contains 'BITS'

Et ci-dessous est ce que vous vous attendriez à voir:

Where-Object equivalent to Get-Service -ServiceName ‘BITS’

N’oubliez jamais de filtrer à gauche ! L’exemple précédent équivaut à exécuter Get-Service -ServiceName 'BITS' .

Peut-être souhaitez-vous être plus élaboré et trouver tous les services avec un État qui n’est pas Running et un Type de démarrage qui est dans une seule chaîne (ou pourrait être un tableau) appelée Manual. En utilisant un bloc de script ci-dessous, la commande utilise le paramètre FilterScript pour passer un bloc de script qui évalue ces deux conditions.

Connexe: Retour aux bases : Comprendre les objets PowerShell

Get-Service |
	Where-Object {($_.Status -notcontains 'Running') -and ($_.StartType -in 'Manual')}

Lorsque vous exécutez la commande ci-dessus, vous ne verrez que les services qui sont arrêtés et ont un StartType de Manuel.

More advanced filtering of a collection of objects

Le filtrage avec des opérateurs de containment fonctionne bien avec les collections qui contiennent de nombreuses valeurs de propriété. Étant donné le nombre de propriétés que Get-Service renvoie, le filtrage à travers toutes ces propriétés est facilité lorsque vous combinez les opérateurs de containment et les opérateurs logiques.

Opérateurs de Correspondance

De manière similaire à l’utilisation des opérateurs de containment avec Where-Object, vous pouvez également utiliser des opérateurs de correspondance. Les opérateurs de correspondance vous permettent de faire correspondre des chaînes à l’intérieur d’autres chaînes. Par exemple, 'foofoo' -like '*foo*' renvoie True, ou 'foofoo' -match 'foo' renvoie True. Les opérateurs de correspondance font correspondre des chaînes dans des chaînes.

En PowerShell, vous disposez de quelques opérateurs de correspondance différents que vous pouvez utiliser dans Where-Object.

  • -like / -clike – la chaîne correspond à un motif générique.
  • -notlike / -cnotlike – la chaîne ne correspond pas à un motif générique.
  • -match / -cmatch – la chaîne correspond à un motif regex.
  • -notmatch / -cnotmatch – la chaîne ne correspond pas à un motif regex

Pour la sensibilité à la casse, utilisez des opérateurs de correspondance qui commencent par -c[operateur]

Presque identiques en forme aux opérateurs de confinement, vous pouvez utiliser les opérateurs de correspondance comme indiqué ci-dessous. L’exemple ci-dessous consiste à trouver tous les services qui ont Windows dans la valeur de la propriété DisplayName.

Get-Service | Where-Object { $_.DisplayName -match 'Windows'}
The match operator uses regular expressions to match on certain values.

Connexe : Démarrage avec PowerShell et Regex

Vous pouvez également utiliser l’opérateur like pour utiliser des techniques de correspondance courantes telles que l’utilisation d’un joker (*) pour correspondre à n’importe quel caractère ou peut-être à un ? pour correspondre à un seul caractère.

Get-Service | Where-Object {($_.Name -like 'Win*')}

Les résultats sont maintenant filtrés pour ne montrer que les noms de service avec ‘Win‘ comme trois premiers caractères :

service names with ‘Win

Utiliser le joker signifie que vous n’avez pas besoin de connaître le nom complet du service. Quelques lettres de la chaîne suffisent. Ces opérateurs peuvent également être combinés avec les opérateurs logiques pour améliorer encore davantage le filtrage.

Opérateurs d’égalité

Similaire à l’utilisation des opérateurs de confinement et de comparaison, vous pouvez également utiliser des opérateurs d’égalité avec Where-Object. Les opérateurs d’égalité sont utiles lorsqu’il est nécessaire de comparer des valeurs numériques.

Par exemple, 1 -eq 1 serait True tandis que 1 -gt 2 serait False. PowerShell a de nombreux opérateurs d’égalité différents que vous pouvez utiliser comme paramètres de Where-Object ou à l’intérieur de blocs de script conditionnels.

  • -eq / -ceq – valeur égale à la valeur spécifiée.
  • -ne / -cne – valeur non égale à la valeur spécifiée.
  • -gt / -cgt – valeur supérieure à la valeur spécifiée.
  • -ge / -cge – valeur supérieure ou égale à la valeur spécifiée.
  • -lt / -clt – valeur inférieure à la valeur spécifiée.
  • -le / -cle – valeur inférieure ou égale à la valeur spécifiée.

Par exemple, peut-être souhaitez-vous trouver tous les processus en cours d’exécution qui utilisent entre deux et dix pour cent de votre CPU. Pas de problème avec les cmdlets PowerShell Get-Process et Where-Object.

En utilisant un scriptblock, vous pouvez combiner deux conditions ensemble en utilisant l’opérateur and qui les évaluera toutes les deux. Si elles retournent toutes les deux Vrai, Where-Object renvoie l’objet de processus passé sur le pipeline. Si au moins l’une des conditions retourne Faux, Where-Object abandonne l’objet.

Get-Process | Where-Object {($_.CPU -gt 2.0) -and ($_.CPU -lt 10)}

Voici à quoi vous pouvez vous attendre:

Filtering with greater than and less than

Le filtrage en utilisant les opérateurs d’égalité Where-Object vous aidera à construire des rapports système ou à comparer des valeurs.

Étapes suivantes

Maintenant que vous en savez plus sur la façon d’utiliser la cmdlet Where-Object de PowerShell pour filtrer toutes les choses, que pouvez-vous faire d’autre ? Essayez des tâches de filtrage plus complexes en utilisant plusieurs conditions et opérateurs sur des collections pour filtrer les valeurs des propriétés et formater la sortie selon vos préférences.

Source:
https://adamtheautomator.com/powershell-where-object/