Dans Windows PowerShell, vous générez et passez à un pipeline souvent plus d'objets que vous ne le souhaitez. Vous pouvez spécifier les propriétés d'objets particuliers à afficher en utilisant les applets de commande Format, mais cela ne contribue pas à résoudre le problème de suppression d'objets entiers de l'affichage. Vous pouvez filtrer les objets avant la fin d'un pipeline de façon à n'exécuter des actions que sur un sous-ensemble des objets générés initialement.
Windows PowerShell inclut une applet de commande Where-Object qui vous permet de tester chaque objet du pipeline et de ne le passer à la suite du pipeline que s'il satisfait une condition de test particulière. Les objets qui ne réussissent pas le test sont supprimés du pipeline. Vous fournissez la condition de test comme valeur du paramètre Where-Object FilterScript .
Exécution de tests simples avec Where-Object
La valeur de FilterScript est un bloc de script (une ou plusieurs commandes Windows PowerShell entre accolades {}) qui prend la valeur true (vrai) ou false (faux). Ces blocs de script peuvent être très simples, mais leur création implique de connaître un autre concept Windows PowerShell : les opérateurs de comparaison. Un opérateur de comparaison compare les éléments qui se situent à sa gauche et à sa droite. Les opérateurs de comparaison commencent par le caractère « - » et sont suivis par un nom. Les opérateurs de comparaison de base fonctionnent sur quasiment n'importe quel type d'objet. Les opérateurs de comparaison plus évolués peuvent ne fonctionner que sur du texte ou des tableaux.
Remarque : | |
Par défaut, lorsqu'ils agissent sur du texte, les opérateurs de comparaison Windows PowerShell ne sont pas sensibles à la casse. |
Pour des raisons d'analyse, les opérateurs de comparaison n'utilisent pas de symboles tels que <, >, et =. mais sont constitués de lettres. Les opérateurs de comparaison de base sont répertoriés dans le tableau suivant :
Opérateur de comparaison | Signification | Exemple (retourne true) |
---|---|---|
-eq |
Est égal à |
1 -eq 1 |
-ne |
Est différent de |
1 -ne 2 |
-lt |
Est inférieur à |
1 -lt 2 |
-le |
Est inférieur ou égal à |
1 -le 2 |
-gt |
Est supérieur à |
2 -gt 1 |
-ge |
Est supérieur ou égal à |
2 -ge 1 |
-like |
Est similaire à (comparaison générique pour du texte) |
"file.doc" -like "f*.do?" |
-notlike |
N'est pas similaire à (comparaison générique pour du texte) |
"file.doc" -notlike "p*.doc" |
-contains |
Contient |
1,2,3 -contains 1 |
-notcontains |
Ne contient pas |
1,2,3 -notcontains 4 |
Les blocs de script Where-Object utilisent la variable spéciale « $_ » pour faire référence à l'objet actif du pipeline. Voici un exemple de la façon dont cela fonctionne. Si vous disposez d'une liste de nombres et souhaitez ne retourner que ceux qui sont inférieurs à 3, vous pouvez utiliser Where-Object pour filtrer les nombres en tapant :
PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3} 1 2
Filtrage selon les propriétés d'un objet
Étant donné que $_ fait référence à l'objet actif du pipeline, nous pouvons accéder à ses propriétés pour nos tests.
À titre d'exemple, nous pouvons nous intéresser à la classe Win32_SystemDriver de WMI. Un système particulier peut contenir des centaines de pilotes système, mais vous pouvez n'être intéressé que par un jeu particulier de pilotes système, tels ceux qui sont en cours d'exécution. Si vous utilisez Get-Member pour afficher les membres de Win32_SystemDriver (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property), vous pouvez voir que la propriété correspondante est State et qu'elle porte la valeur « Running » lorsque le pilote est en cours d'exécution. Vous pouvez filtrer les pilotes système afin de sélectionner uniquement ceux qui sont exécutés en tapant :
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}
La liste produite reste longue. Vous pouvez filtrer de manière à sélectionner uniquement les pilotes configurés pour démarrer automatiquement en testant également la valeur StartMode :
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Auto"} DisplayName : RAS Asynchronous Media Driver Name : AsyncMac State : Running Status : OK Started : True DisplayName : Audio Stub Driver Name : audstub State : Running Status : OK Started : True
Cela nous donne beaucoup d'informations dont nous n'avons plus besoin puisque nous savons que les pilotes sont en cours d'exécution. En fait, les seules informations dont nous avons probablement besoin à ce stade sont le nom et le nom d'affichage. La commande suivante inclut uniquement ces deux propriétés, ce qui simplifie grandement la sortie :
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName Name DisplayName ---- ----------- AsyncMac RAS Asynchronous Media Driver Fdc Floppy Disk Controller Driver Flpydisk Floppy Disk Driver Gpc Generic Packet Classifier IpNat IP Network Address Translator mouhid Mouse HID Driver MRxDAV WebDav Client Redirector mssmbios Microsoft System Management BIOS Driver
La commande précédente contient deux éléments Where-Object, mais ils peuvent être exprimés en un seul élément Where-Object en utilisant l'opérateur logique -and, comme suit :
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName
Les opérateurs logiques standard sont répertoriés dans le tableau suivant :
Opérateur logique | Signification | Exemple (retourne true) |
---|---|---|
-and |
and logique ; true (vrai) si les deux côtés sont true |
(1 -eq 1) -and (2 -eq 2) |
-or |
or logique ; true si l'un des côtés est true |
(1 -eq 1) -or (1 -eq 2) |
-not |
not logique ; inverse true et false (faux) |
-not (1 -eq 2) |
! |
not logique ; inverse true et false (faux) |
!(1 -eq 2) |