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)




Table des matières