Points clés
- Syntaxe de filtrage de base : transmettez la sortie d’une commande à Where-Object et utilisez les opérateurs de comparaison (-eq, -gt, -lt, etc.) pour filtrer les objets selon la valeur de leurs propriétés.
- Filtrage avec des blocs de script : utilisez les blocs de script {} et $_ pour appliquer une logique plus élaborée, comme des conditions multiples, une correspondance de motif ou des comparaisons calculées.
- Valeurs multiples et regex : filtrez selon plusieurs valeurs à l’aide de tableaux et d’opérateurs comme -contains, ou appliquez des expressions régulières avec -match pour un filtrage avancé de chaînes.
- Filtrage par date : comparez les propriétés DateTime (LastWriteTime, TimeGenerated, etc.) avec Get-Date pour filtrer les objets sur des plages de temps précises.
- Tâches d’automatisation concrètes : appliquez Where-Object à des scénarios d’administration courants, comme le nettoyage des anciens fichiers, l’identification des processus gourmands en ressources, le filtrage des utilisateurs AD et l’exploration des journaux d’événements.
- Bonnes pratiques de performance : filtrez à gauche avec les paramètres -Filter propres au cmdlet lorsqu’ils existent, simplifiez les conditions et utilisez Measure-Command pour diagnostiquer les filtres lents.
PowerShell est un langage de ligne de commande et de script destiné à l’administration système et à l’automatisation sous Windows. C’est un élément essentiel de la boîte à outils de tout administrateur ou développeur Windows. Filtrer la sortie des commandes PowerShell avec Where-Object permet de retrouver rapidement les données pertinentes à afficher, ou d’effectuer des opérations sur un sous-ensemble d’objets selon vos critères de filtrage.
Ce guide explique comment utiliser Where-Object pour filtrer des objets et des données dans PowerShell. Il propose des exemples concrets que vous pouvez copier-coller dans votre propre code. Il aborde également les aspects liés aux performances et les bonnes pratiques d’utilisation de Where-Object dans vos scripts PowerShell.
💡 Vous pouvez suivre cette procédure en images dans notre guide vidéo : comment filtrer des données avec Where-Object dans PowerShell.
Le cmdlet PowerShell Where-Object en détail
Le CmdLet PowerShell Where-Object (un CmdLet est une commande PowerShell utilisée pour l’automatisation) filtre une collection d’objets renvoyée par une commande pour ne conserver que ceux qui correspondent à vos critères de recherche.
Voici la syntaxe et les paramètres les plus couramment utilisés avec Where-Object :
[ Command ] | Where-Object [ -Property ] [ -Value ] [ Operator ]
À noter :
- [ Command ] est la commande dont la sortie est filtrée par Where-Object.
- [ -Property ] est la propriété de l’objet à comparer, fournie sous forme de chaîne.
- [ -Value ] est la valeur à laquelle comparer la propriété, fournie sous forme d’objet ou de chaîne.
- Le dernier paramètre est l’[ Operator ] de comparaison à utiliser : -eq (égal à), -ne (différent de), -gt (supérieur à), -lt (inférieur à), -ge (supérieur ou égal à), -le (inférieur ou égal à).
La sortie est transmise à Where-Object via un pipe. D’autres options de syntaxe sont présentées dans la documentation PowerShell. Il est également possible de fournir vos propres critères de filtrage plus complexes sous forme de bloc de code, comme le montrent les exemples plus loin dans cet article.
Exemples concrets de filtrage d’objets avec Where-Object
Le meilleur moyen de comprendre l’utilisation de Where-Object est de le voir à l’œuvre. Vous trouverez ci-dessous plusieurs exemples simples illustrant l’usage de base avec les opérateurs de comparaison intégrés, ainsi qu’un usage avancé avec des critères personnalisés dans des blocs de script. Ces exemples montrent comment filtrer selon plusieurs valeurs, utiliser des regex et filtrer par date.
Suivent plusieurs commandes PowerShell complètes qui font appel à Where-Object pour réaliser des tâches de script courantes : nettoyer des fichiers journaux, identifier les processus qui consomment beaucoup de mémoire, filtrer des utilisateurs Active Directory ou encore explorer des journaux d’événements.
Filtrer une valeur unique
Cet exemple montre comment filtrer sur une valeur unique avec l’opérateur de comparaison -eq :
# Filtre les processus en cours d’exécution pour ne garder que ceux nommés « powershell »
Get-Process | Where-Object Name -eq ‘powershell’
Filtrer selon plusieurs valeurs
Cet exemple montre comment filtrer selon plusieurs valeurs. Il filtre la liste des processus en cours d’exécution renvoyée par Get-Process pour ne conserver que ceux nommés « winlogon » et « explorer » (les deux devraient être actifs pour chaque utilisateur connecté) :
# Filtre les processus en cours d’exécution nommés « winlogon » ou « explorer »
$names = @(‘winlogon’, ‘explorer’) # Définit un tableau contenant les différentes valeurs recherchées
Get-Process | Where-Object { $names -contains $_.Name }
Les accolades de cet exemple délimitent un bloc de script PowerShell contenant un ensemble d’expressions. Notez également l’usage de $_, un raccourci qui représente l’objet en cours de comparaison. Ici, il sert à fournir la propriété Name de l’objet à la comparaison.
Utiliser les expressions régulières
Where-Object fonctionne aussi avec les tableaux. Les regex permettent de filtrer tout type d’objet et offrent un moyen d’ajouter des conditions complexes basées sur le contenu des chaînes :
# Filtre un tableau d’adresses e-mail pour ne garder que celles d’un domaine précis
$emailAddresses = @(« [email protected] », « [email protected] », « [email protected] ») # Définit un tableau d’adresses e-mail
$emailAddresses | Where-Object { $_ -match ‘@test.com$’ }
Notez que vous pourriez également utiliser la méthode Where() des tableaux, abordée plus loin dans cet article.
Filtrer par date
Pour les commandes qui renvoient des objets dotés de propriétés de type date, vous pouvez filtrer à l’aide des objets DateTime renvoyés par Get-Date :
# Recherche les fichiers du répertoire courant modifiés au cours des 14 derniers jours
Get-ChildItem -Path . | Where-Object { $_.LastWriteTime -GT (Get-Date).AddDays(-14) }
Vous pouvez aussi filtrer entre deux dates en fournissant une plage de dates :
# Recherche les entrées du journal d’événements Windows de la semaine passée
$startDate = (Get-Date).AddDays(-7) # Notez l’usage d’un nombre négatif pour situer la date dans le passé
$endDate = Get-Date
Get-EventLog -LogName Application | Where-Object { $_.TimeGenerated -ge $startDate -and $_.TimeGenerated -le $endDate }
Exemples avancés : critères personnalisés dans des blocs de script
Comme le montrent les exemples ci-dessus, les blocs de script peuvent contenir plusieurs expressions de comparaison. Vous pouvez réaliser des filtrages plus complexes avec Where-Object en fournissant plusieurs critères et conditions dans des blocs de script. En voici quelques exemples :
# Filtre les processus dont l’utilisation du processeur dépasse 75 %
Get-Process | Where-Object { $_.CPU -gt 75 }
# Recherche les services en cours d’exécution dont le nom commence par « Win »
Get-Service | Where-Object { $_.Status -eq ‘Running’ -and $_.Name -like ‘Win*’ }
# Recherche les fichiers du répertoire courant de plus de 3 Mo modifiés au cours des 30 derniers jours
Get-ChildItem -Path . | Where-Object { $_.Length -gt 3MB -and $_.LastWriteTime -gt (Get-Date).AddDays(-30) }
Exemples courants de Where-Object en situation réelle
En plus des exemples ci-dessus, voici d’autres commandes PowerShell fréquemment nécessaires pour l’automatisation et l’administration système :
# Recherche les fichiers .txt du répertoire courant
Get-ChildItem -Path . | Where-Object Extension -eq ‘.txt’
# Supprime les fichiers journaux d’un chemin donné vieux de plus de 90 jours
Get-ChildItem -Path ‘C:PathToLogs’ -Filter ‘*.log’ | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-90) } | Remove-Item
# Liste les processus qui utilisent plus de 1000 Mo de mémoire
Get-Process | Where-Object { $_.WorkingSet -gt 1000MB } | Select-Object Name, WorkingSet
# Recherche les utilisateurs Active Directory membres d’un groupe donné (marketing) et occupant une fonction précise (Director)
Import-Module ActiveDirectory
Get-ADUser -Filter { MemberOf -eq ‘CN=Marketing,OU=Groups,DC=example,DC=com’ -and Title -eq ‘Director’ }
# Recherche les entrées du journal d’événements Windows de type erreur liées à une application précise (MyApplication)
Get-EventLog -LogName Application -EntryType Error | Where-Object { $_.Source -eq ‘MyApplication’ }
Notez l’usage combiné de Where-Object et Select-Object dans cet exemple pour extraire les données pertinentes des résultats.
Ce qui distingue Where-Object des autres méthodes de filtrage
Il existe plusieurs façons de filtrer des données dans PowerShell, certaines pour les objets, d’autres pour le texte. Elles ne se comportent pas de la même manière : choisissez donc celle qui convient le mieux à chaque situation.
- Where-Object : filtre les collections d’objets transmises à la commande pour ne conserver que les objets correspondants.
- Select-Object : permet en outre de filtrer les propriétés des objets, par exemple en renvoyant une collection d’objets en n’incluant que la propriété « name » de chacun.
- Méthode Where() des tableaux : filtre les tableaux selon les conditions fournies.
- Paramètre Filter : certains cmdlets proposent un paramètre -Filter pour effectuer une recherche dans leur sortie.
Performances : ce qu’il faut prendre en compte lors du filtrage
Le filtrage de données peut consommer beaucoup de ressources. Les commandes PowerShell, en particulier lorsqu’elles interrogent des bases de données ou Active Directory, peuvent renvoyer plusieurs milliers d’enregistrements. Utiliser Where-Object pour traiter et filtrer chacun d’entre eux n’est pas la méthode la plus efficace pour explorer de grands volumes de données.
De nombreuses commandes PowerShell disposent d’un paramètre -Filter optimisé pour la recherche avec cette commande. Lorsqu’un paramètre -Filter est disponible, il est recommandé de l’utiliser pour réduire au maximum le volume de données avant de les transmettre à Where-Object.
Par exemple, si vous travaillez sur des données Active Directory avec le Get-ADUser, et que vous souhaitez récupérer la liste des utilisateurs d’un service donné, puis effectuer différentes actions selon leur fonction, utilisez -Filter pour limiter les résultats à ce service. Vous pourrez ensuite utiliser Where-Object pour agir en fonction de la fonction occupée, sur une liste d’objets réduite.
Si votre script PowerShell met trop de temps à s’exécuter et que vous soupçonnez une commande contenant Where-Object d’en être la cause, vous pouvez évaluer ses performances avec le cmdlet Measure-Command, qui mesure le temps nécessaire à l’exécution de la commande.
Bonnes pratiques et pièges courants avec Where-Object dans PowerShell
Les utilisateurs de Where-Object se heurtent à quelques pièges récurrents, que les bonnes pratiques suivantes permettent d’éviter :
- « Filtrer à gauche » : utilisez le paramètre -Filter propre au cmdlet, ou d’autres paramètres de recherche, le plus tôt possible dans vos commandes PowerShell (c’est-à-dire le plus à gauche possible) pour maximiser l’efficacité.
- Utilisez Select-Object pour écarter les propriétés inutiles : cela améliore les performances lorsque vous manipulez de grands volumes de données (que vous ne pouvez pas filtrer autrement à l’aide de fonctions propres au cmdlet).
- Restez simple : évitez les conditions complexes dans les blocs de script et décomposez-les autant que possible pour améliorer les performances et faciliter le débogage.
- Utilisez correctement les opérateurs de comparaison : assurez-vous de bien comprendre ce que font vos paramètres de filtrage et vos blocs de script afin d’éviter les résultats inattendus.
- Gardez vos scripts lisibles : vous pouvez utiliser ? comme alias de Where-Object pour raccourcir les commandes et en faciliter la lecture. Pensez aussi aux espaces et à l’indentation pour un code bien formaté et lisible, et ajoutez des commentaires indiquant le rôle de chaque ligne de votre script PowerShell (au cas où vous y reviendriez des mois ou des années plus tard en ayant oublié l’objectif d’une commande).
Pour faciliter le débogage des commandes Where-Object, vous pouvez utiliser le paramètre commun PowerShell verbose afin d’afficher des informations détaillées sur l’opération en cours. Par exemple :
$VerbosePreference = "Continue"
Get-Process | Where-Object { $_.CPU -gt 75 } -Verbose
Pensez également à utiliser des blocs try-catch pour gérer proprement les erreurs inattendues.
Le filtrage de données avec Where-Object dans PowerShell vous permet d’afficher les informations pertinentes renvoyées par les cmdlets, de rechercher des fichiers et des processus, et de trier les résultats de n’importe quelle commande PowerShell qui renvoie des objets, y compris les outils dédiés à Active Directory. Pour découvrir comment Where-Object peut vous aider dans les tâches d’administration système répétitives, consultez notre tutoriel sur l’utilisation de PowerShell pour l’automatisation.
