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)




Tabla de contenido