Suppression d’objets du pipeline
Dans PowerShell, vous générez et transmettez souvent à un pipeline plus d’objets que souhaité. Vous pouvez spécifier les propriétés d’objets particuliers à afficher à l’aide des cmdlets Format-*
, mais cela ne résout pas le problème de la suppression d’objets entiers de l’affichage. Il se peut que vous souhaitiez filtrer des objets avant la fin d’un pipeline afin de pouvoir effectuer des actions uniquement sur un sous-ensemble des objets générés initialement.
PowerShell inclut une cmdlet Where-Object
qui permet de tester chaque objet dans le pipeline et de le transmettre dans le pipeline uniquement s’il répond à une condition de test particulière. Les objets qui ne passent pas le test sont supprimés du pipeline. Vous fournissez la condition de test comme valeur du paramètre FilterScript.
Exécution de tests simples avec l’applet de commande Where-objet
La valeur de FilterScript est un bloc de script : une ou plusieurs commandes PowerShell entourées d’accolades ({}
) qui prend la valeur true ou false. Ces blocs de script peuvent être simples, mais leur création nécessite de connaître un autre concept de PowerShell, à savoir les opérateurs de comparaison. Un opérateur de comparaison compare les éléments figurant de part et d’autre de celui-ci. Les opérateurs de comparaison commencent par un caractère (-
) suivi d’un nom. Les opérateurs de comparaison de base fonctionnent sur pratiquement tout type d’objet. Certains opérateurs de comparaison plus avancés fonctionnent uniquement sur du texte ou des tableaux.
Notes
Par défaut, les opérateurs de comparaison PowerShell ne respectent pas la casse.
En raison de considérations liées à l’analyse, les symboles tels que <
,>
et =
ne sont pas utilisés comme opérateurs de comparaison. Au lieu de cela, les opérateurs de comparaison 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 | n’est pas égal à | 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 comme (comparaison générique pour le texte) | "file.doc" -like "f*.do?" |
-notlike | n’est pas comme (comparaison générique pour le 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 actuel dans le pipeline. Voici un exemple de son fonctionnement. Si vous avez une liste de nombres et souhaitez retourner uniquement ceux dont la valeur est inférieure à 3, vous pouvez utiliser Where-Object
pour filtrer les nombres en tapant ce qui suit :
1,2,3,4 | Where-Object {$_ -lt 3}
1
2
Filtrage basé sur les propriétés de l’objet
Comme $_
fait référence à l’objet de pipeline actif, nous pouvons accéder à ses propriétés pour nos tests.
Par exemple, nous pouvons examiner la classe Win32_SystemDriver dans WMI. Il peut y avoir des centaines de pilotes système sur un système particulier, mais il se peut que vous vous intéressiez uniquement à certains pilotes, par exemple, à ceux qui sont en cours d’exécution. Pour la classe Win32_SystemDriver la propriété appropriée est État. Vous pouvez filtrer les pilotes du système afin de sélectionner uniquement ceux qui sont en cours d’exécution, en tapant ce qui suit :
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq 'Running'}
Cela génère toujours une longue liste. Il se peut que vouliez filtrer afin de sélectionner uniquement les pilotes configurés pour démarrer automatiquement, en testant également la valeur StartMode :
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq "Running"} |
Where-Object {$_.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 produit un grand nombre d’informations dont nous n’avons plus besoin, car nous savons que les pilotes sont en cours d’exécution. En fait, les seules informations dont nous ayons probablement besoin à ce stade sont le nom et le nom d’affichage. La commande suivante inclut uniquement ces deux propriétés, de sorte que la sortie est beaucoup plus simple :
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq "Running"} |
Where-Object {$_.StartMode -eq "Manual"} |
Format-Table -Property Name,DisplayName
Name DisplayName
---- -----------
AsyncMac RAS Asynchronous Media Driver
bindflt Windows Bind Filter Driver
bowser Browser
CompositeBus Composite Bus Enumerator Driver
condrv Console Driver
HdAudAddService Microsoft 1.1 UAA Function Driver for High Definition Audio Service
HDAudBus Microsoft UAA Bus Driver for High Definition Audio
HidUsb Microsoft HID Class Driver
HTTP HTTP Service
igfx igfx
IntcDAud Intel(R) Display Audio
intelppm Intel Processor Driver
...
Il existe deux éléments Where-Object
dans la commande ci-dessus, mais ils peuvent être exprimés en un seul élément Where-Object
à l’aide de l’opérateur logique -and
comme suit :
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} |
Format-Table -Property Name,DisplayName
Les opérateurs logiques standards sont répertoriés dans le tableau suivant.
Opérateur logique | Signification | Exemple (retourne true) |
---|---|---|
-and |
Opérateur logique et ; true si les deux côtés sont vrais | (1 -eq 1) -and (2 -eq 2) |
-or |
Opérateur logique ou ; true si l’un des côtés est vrai | (1 -eq 1) -or (1 -eq 2) |
-not |
Opérateur logique non ; inverse les valeurs true et false | -not (1 -eq 2) |
! |
Opérateur logique non ; inverse les valeurs true et false | !(1 -eq 2) |