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.
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.

De nombreuses personnes utilisent des paramètres positionnels avec la cmdlet
Where-Object
et n’incluent pas le nom du paramètreFilterScript
. Au lieu de cela, elles fournissent simplement le scriptblock seul, commeWhere-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:
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.
Et ci-dessous est ce que vous vous attendriez à voir:

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
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.

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.

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.
Les résultats sont maintenant filtrés pour ne montrer que les noms de service avec ‘Win‘ comme trois premiers caractères :

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.
Voici à quoi vous pouvez vous attendre:

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/