• 12/23/2019
  • 4 minutos para leer
    • j
    • s
    • m

En PowerShell, a menudo generas y pasas más objetos a un pipeline de los que quieres. Usted puede especificar las propiedades de los objetos particulares para mostrar mediante el uso de la Format-* cmdlets, pero thisdoes no ayuda con el problema de la eliminación de objetos enteros de la pantalla. Es posible que desee filtrar objetos antes del final de una canalización, para poder realizar acciones sólo en un subconjunto de los objetos generados inicialmente.

PowerShell incluye un cmdlet Where-Objectque le permite probar cada objeto en la canalización y sólo pasarlo a lo largo de la canalización si cumple una condición de prueba particular. Los objetos que no pasan la prueba se eliminan de la tubería. Usted suministra la condición de prueba como el valor del parámetroFilterScript.

Realización de pruebas sencillas con Where-Object

El valor de FilterScript es un bloque de script -uno o más comandos de PowerShell rodeados por llaves ({})- que se evalúa como verdadero o falso. Estos bloques de script pueden ser muy sencillos, pero crearlos requiere conocer otro concepto de PowerShell, los operadores de comparación. Un operador de comparación compara los elementos que aparecen a cada lado del mismo. Los operadores de comparación comienzan con un guión (-) y van seguidos de un nombre. Los operadores de comparación básicos funcionan con casi cualquier tipo de objeto. Los operadores de comparación más avanzados sólo pueden funcionar con texto o matrices.

Nota

Por defecto, cuando se trabaja con texto, los operadores de comparación de PowerShell no distinguen entre mayúsculas y minúsculas.

Debido a consideraciones de análisis sintáctico, los símbolos como <,> y = no se utilizan como operadores de comparación. En su lugar, los operadores de comparación se componen de letras. Los operadores de comparación básicos se enumeran en la siguiente tabla.

1 -eq 1

-ne

-lt Es menor que 1 -lt 2 -le Es menor o igual que 1 -le 2 -gt Es mayor que 2 -gt 1 -ge

-like Es like (comparación comodín para texto) «file.doc» -como «f*.do?»

No es como (comparación de comodines para texto)

contiene

1,2,3 -contiene 1

-no contiene No contiene 1,2,3 -no contiene 4
Operador de comparación Significado Ejemplo (devuelve verdadero)
-eq es igual a
No es igual a 1 -ne 2
Es mayor o igual que 2 -ge 1
-no es como «archivo.doc» -no es como «p*.doc»
Contiene

Where-Object Los bloques de script utilizan la variable especial $_ para referirse al objeto actual de la línea de producción. He aquí un ejemplo de cómo funciona. Si tiene una lista de números y sólo quiere devolver los que son menores de 3, puede utilizar Where-Object para filtrar los números escribiendo:

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

Filtrado basado en las propiedades del objeto

Dado que $_ se refiere al objeto actual de la tubería, podemos acceder a sus propiedades para nuestras pruebas.

Como ejemplo, podemos mirar la clase Win32_SystemDriver en WMI. Puede haber cientos de controladores del sistema en un sistema en particular, pero es posible que sólo esté interesado en un conjunto particular de los controladores del sistema, como los que se están ejecutando actualmente. Para la clase Win32_SystemDriver la propiedad relevante es State. Puede filtrar los controladores del sistema, seleccionando sólo los que se están ejecutando, escribiendo:

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

Esto aún produce una larga lista. Puede filtrar para seleccionar sólo los controladores configurados para iniciarse automáticamente comprobando también el valor de 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...

Esto nos da mucha información que ya no necesitamos porque sabemos que los controladores se están ejecutando.De hecho, la única información que probablemente necesitemos en este punto son el nombre y el nombre de pantalla. El siguiente comando incluye sólo esas dos propiedades, lo que resulta en una salida mucho más 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...

Hay dos elementos Where-Object en el comando anterior, pero se pueden expresar en un solo elementoWhere-Object utilizando el operador lógico -and, así:

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

Los operadores lógicos estándar se enumeran en la siguiente tabla.

y Lógico y; verdadero si ambos lados son verdaderos

-o Lógico o; ¡verdadero si cualquiera de los lados es verdadero

-no Lógico no; invierte verdadero y falso -no (1 -eq 2) ! Lógico no; invierte verdadero y falso

Operador lógico Significado Ejemplo (devuelve verdadero)
(1 -eq 1) -y (2 -eq 2)
(1 -eq 1) -o (1 -eq 2)
!(1 -eq 2)

admin

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

lg