En Windows PowerShell, a menudo se generan y pasan a una canalización más objetos de los deseados. Puede especificar las propiedades de objetos específicos que desee mostrar mediante los cmdlets Format, pero esto no ayuda a quitar objetos completos de la presentación. Quizá desee filtrar objetos antes del final de una canalización, para así poder realizar acciones sólo en un subconjunto de los objetos generados inicialmente.
Windows PowerShell incluye un cmdlet Where-Object que permite probar cada objeto de la canalización y pasarlo por esta sólo si cumple una determinada condición de prueba. Los objetos que no superen la prueba se quitan de la canalización. La condición de prueba se proporciona como el valor del parámetro Where-Object FilterScript.
Realizar pruebas simples con Where-Object
El valor de FilterScript es un bloque de script (uno o más comandos de Windows PowerShell especificados entre llaves {}) que se evalúa como True o False. Estos bloques de script pueden ser muy sencillos, pero para crearlos hay que conocer otro concepto de Windows PowerShell: los operadores de comparación. Un operador de este tipo compara los elementos que aparecen a cada lado del mismo. Los operadores de comparación comienzan por un carácter "-" seguido de un nombre. Los operadores de comparación básicos se pueden usar con prácticamente cualquier tipo de objeto, mientras que los más avanzados solamente pueden utilizarse con texto o matrices.
Nota: | |
De manera predeterminada, cuando se trabaja con texto, los operadores de comparación de Windows PowerShell no distinguen entre mayúsculas y minúsculas. |
Para facilitar el análisis del código, símbolos como <,> y el signo igual (=) no se utilizan como operadores de comparación. En su lugar, los operadores de comparación están formados por letras. En la siguiente tabla se muestran los operadores de comparación básicos:
Operador de comparación | Significado | Ejemplo (devuelve el valor True) |
---|---|---|
-eq |
Es igual a |
1 -eq 1 |
-ne |
Es distinto de |
1 -ne 2 |
-lt |
Es menor que |
1 -lt 2 |
-le |
Es menor o igual que |
1 -le 2 |
-gt |
Es mayor que |
2 -gt 1 |
-ge |
Es mayor o igual que |
2 -ge 1 |
-like |
Es como (comparación de caracteres comodín para texto) |
"file.doc" -like "f*.do?" |
-notlike |
No es como (comparación de caracteres comodín para texto) |
"file.doc" -notlike "p*.doc" |
-contains |
Contiene |
1,2,3 -contains 1 |
-notcontains |
No contiene |
1,2,3 -notcontains 4 |
Los bloques de script de Where-Object usan la variable especial "$_" para hacer referencia al objeto actual en la canalización. A continuación se muestra un ejemplo de cómo funciona. Si tiene una lista de números y desea que solo se devuelvan los que sean menores que 3, puede utilizar Where-Object para filtrar los números; para ello, escriba:
PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3} 1 2
Filtrado basado en propiedades de objetos
Dado que $_ hace referencia al objeto de canalización actual, podemos tener acceso a sus propiedades para nuestras pruebas.
A modo de ejemplo, examinemos la clase Win32_SystemDriver de WMI. Puede haber cientos de controladores en un sistema determinado, pero quizá sólo esté interesado en un conjunto específico de controladores del sistema, como los que se están ejecutando actualmente. Si utiliza Get-Member para ver los miembros de Win32_SystemDriver (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property), observará que la propiedad relevante es State y que tiene el valor "Running" cuando el controlador se está ejecutando. Para filtrar los controladores del sistema y seleccionar sólo los que se están ejecutando, escriba:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}
La lista generada seguirá siendo muy larga. Quizá desee filtrar de manera que se seleccionen sólo los controladores que se inician automáticamente mediante una prueba del valor de 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
Esto proporciona mucha información que no se necesita, porque sabemos que los controladores se están ejecutando. De hecho, probablemente la única información que se necesita en este momento son el nombre común y el nombre para mostrar. El comando siguiente incluye únicamente estas dos propiedades, por lo que el resultado es mucho más sencillo:
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
El comando anterior contiene dos elementos Where-Object, pero se pueden expresar en un solo elemento Where-Object usando el operador lógico -and, de esta manera:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName
En la siguiente tabla se enumeran los operadores lógicos estándar:
Operador lógico | Significado | Ejemplo (devuelve el valor True) |
---|---|---|
-and |
And lógico; devuelve True si ambos lados son True. |
(1 -eq 1) -and (2 -eq 2) |
-or |
Or lógico; devuelve True si cualquiera de los lados es True. |
(1 -eq 1) -or (1 -eq 2) |
-not |
Not lógico; invierte True y False. |
-not (1 -eq 2) |
! |
Not lógico; invierte True y False. |
!(1 -eq 2) |