• 12/23/2019
  • 4 minutes de lecture
    • j
    • s
    • m

En PowerShell, vous générez et transmettez souvent à un pipeline plus d’objets que vous ne le souhaitez. Vous pouvez spécifier les propriétés d’objets particuliers à afficher en utilisant les cmdlets Format-*, mais cela n’aide pas à résoudre le problème de la suppression d’objets entiers de l’affichage. Vous pouvez vouloir filtrer les objets avant la fin d’un pipeline, afin de pouvoir effectuer des actions sur seulement un sous-ensemble des objets initialement générés.

PowerShell inclut une cmdlet Where-Object qui vous permet de tester chaque objet dans le pipeline et de ne le faire passer le long du pipeline que s’il répond à une condition de test particulière. Les objets qui ne passent pas le test sont retirés du pipeline. Vous fournissez la condition de test comme valeur du paramètreFilterScript.

Exécution de tests simples avec Where-Object

La valeur de FilterScript est un bloc de script – une ou plusieurs commandes PowerShell entourées d’accolades ({}) – qui évalue à true ou false. Ces blocs de script peuvent être très simples, maisleur création nécessite la connaissance d’un autre concept PowerShell, les opérateurs de comparaison. Un opérateur de comparaison compare les éléments qui apparaissent de chaque côté de lui. Les opérateurs de comparaison commencent par un trait d’union (-) et sont suivis d’un nom. Les opérateurs de comparaison de base fonctionnent sur presque tous les types d’objets. Les opérateurs de comparaison plus avancés pourraient ne fonctionner que sur du texte ou des tableaux.

Note

Par défaut, lorsqu’ils travaillent avec du texte, les opérateurs de comparaison PowerShell sont insensibles à la casse.

En raison de considérations d’analyse syntaxique, des symboles tels que <,> et = ne sont pas utilisés comme opérateurs de comparaison. Au lieu de cela, les opérateurs de comparaison sont composés de lettres. Les opérateurs de comparaison de base sont énumérés dans le tableau suivant.

Opérateur de comparaison Message Exemple (renvoie vrai)
-eq est égal à 1 -eq 1
-ne N’est pas égal à 1 -ne 2
-lt Il 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 avec un caractère générique pour le texte) « file.doc » -like « f*.do ? »
-notlike Is not like (wildcard comparison for text) « file.doc » -notlike « p*.doc »
-contient Contient 1,2,3 -contient 1
-non-contient Ne contient pas 1,2,3 -notcontains 4

Where-Object Les blocs de script utilisent la variable spéciale $_ pour se référer à l’objet courant dans lapipeline. Voici un exemple de fonctionnement. Si vous avez une liste de nombres, et que vous voulez seulement retourner ceux qui sont inférieurs à 3, vous pouvez utiliser Where-Object pour filtrer les nombres en tapant :

1,2,3,4 | Where-Object {$_ -lt 3}12

Filtrage basé sur les propriétés de l’objet

Puisque $_ fait référence à l’objet actuel du pipeline, nous pouvons accéder à ses propriétés pour nos tests.

À titre d’exemple, nous pouvons regarder la classe Win32_SystemDriver dans WMI. Il pourrait y avoir des centaines de pilotes système sur un système particulier, mais vous pourriez n’être intéressé que par un ensemble particulier de ces pilotes système, comme ceux qui sont en cours d’exécution. Pour la classe Win32_SystemDriver, la propriété pertinente est State. Vous pouvez filtrer les pilotes système, en ne sélectionnant que ceux qui sont en cours d’exécution, en tapant :

Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}

Cela produit toujours une longue liste. Vous pouvez filtrer pour ne sélectionner que les pilotes définis 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 DriverName : AsyncMacState : RunningStatus : OKStarted : TrueDisplayName : Audio Stub DriverName : audstubState : RunningStatus : OKStarted : 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 n’inclut que ces deux propriétés, ce qui donne une sortie 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 Driverbindflt Windows Bind Filter Driverbowser BrowserCompositeBus Composite Bus Enumerator Drivercondrv Console DriverHdAudAddService Microsoft 1.1 UAA Function Driver for High Definition Audio ServiceHDAudBus Microsoft UAA Bus Driver for High Definition AudioHidUsb Microsoft HID Class DriverHTTP HTTP Serviceigfx igfxIntcDAud Intel(R) Display Audiointelppm Intel Processor Driver...

Il y a deux éléments Where-Object dans la commande ci-dessus, mais ils peuvent être exprimés en un seul élémentWhere-Object en utilisant l’opérateur logique -and, comme ceci:

Get-CimInstance -Class Win32_SystemDriver | Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} | Format-Table -Property Name,DisplayName

Les opérateurs logiques standard sont listés dans le tableau suivant.

Opérateur logique Signification Exemple (renvoie vrai)
-et Logique et ; vrai si les deux côtés sont vrais (1 -eq 1) -et (2 -eq 2)
-ou Logique ou ; vrai si l’un des deux côtés est vrai (1 -eq 1) -ou (1 -eq 2)
-non Non logique ; inverse vrai et faux -non (1 -eq 2)
! Non logique ; inverse vrai et faux !(1 -eq 2)

.

admin

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

lg