Cómo usar el comando Where-Object en PowerShell

  1. el cmdlet Where-Object en PowerShell
  2. Crear condiciones de filtro con bloques de script en PowerShell
  3. Usar Where-Object para filtrar objetos en PowerShell
  4. Crear condiciones de filtro con parámetros en PowerShell
  5. Usar múltiples declaraciones condicionales
Cómo usar el comando Where-Object en PowerShell

Cuando trabajas con las propiedades de Windows PowerShell en una colección de objetos, a veces necesitarás una forma de filtrar todas las cosas específicas que solo necesitas. Por lo tanto, saber cómo usar el cmdlet Where-Object de Windows PowerShell es una técnica vital que debes tener en tu conjunto de habilidades de Windows PowerShell.

El cmdlet Where-Object es un comando valioso para filtrar objetos. En este artículo, aprenderemos varias maneras de construir un comando Where-Object, su sintaxis y el uso de múltiples declaraciones condicionales.

el cmdlet Where-Object en PowerShell

El único objetivo del cmdlet Where-Object de Windows PowerShell es filtrar la salida de un comando y devolver la información específica que queremos imprimir.

En resumen, el cmdlet Where-Object es un filtro. Nos permite construir una condición que devuelve True o False. Dependiendo del resultado de la situación, el cmdlet entonces devuelve la salida o no.

Puedes crear esa condición de dos maneras: bloques de script y parámetros.

Crear condiciones de filtro con bloques de script en PowerShell

Los bloques de script son un componente vital en Windows PowerShell. Se utilizan en cientos de lugares a lo largo del lenguaje de scripting. Un bloque de script es una función anónima que categoriza código y lo ejecuta en varios lugares.

Ejemplo de bloque de script:

{$_.StartType -EQ 'Automatic'}

Usando la tubería de Windows PowerShell, podrías enviar esos objetos al cmdlet Where-Object y usar el parámetro FilterScript. Dado que el parámetro FilterScript acepta un bloque de script, podemos crear una condición para verificar si la propiedad de cada objeto es igual al valor específico, como en el ejemplo a continuación.

Código de ejemplo:

Get-Service | Where-Object -FilterScript { $_.StartType -eq 'Automatic' }
Nota
Muchas personas utilizan parámetros posicionales con el cmdlet Where-Object y no incluyen el nombre del parámetro FilterScript. En su lugar, proporcionan el bloque de script solo como Where-Object {$_.StartType -eq 'Automatic'} para una forma más rápida y limpia de scripting.

Si bien este tipo de sintaxis funciona para este escenario particular, el concepto de un bloque de script con las llaves ({}) hace que el código sea menos legible y más difícil para los usuarios menos experimentados de Windows PowerShell. Este problema de legibilidad hizo que el equipo de Windows PowerShell introdujera parámetros.

Usar Where-Object para filtrar objetos en PowerShell

El Get-ChildItem obtiene la lista de todos los archivos y carpetas en la ubicación especificada. Supongamos que solo quieres mostrar los archivos .csv en el directorio.

El siguiente ejemplo muestra cómo usar el cmdlet Where-Object para filtrar y seleccionar solo archivos .csv.

Get-ChildItem | Where-Object { $_.extension -eq ".csv" }

En el script anterior, la salida de Get-ChildItem se envía al cmdlet Where-Object. El Where-Object filtra la salida donde la extensión de archivo es .csv.

Salida:

Directory: C:\Users\rhntm


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         3/11/2022   7:57 AM            122 books.csv
-a----          3/8/2022   2:07 PM         780199 house_data.csv
-a----          3/8/2022  10:38 PM            421 play_tennis.csv

También puedes usar Where como el alias para el cmdlet Where-Object.

A continuación, hay otro ejemplo que filtra la lista de procesos con el valor de la propiedad ProcessName. Muestra solo los procesos que tienen spotify como ProcessName.

Get-Process | where { $_.ProcessName -in "spotify" }

Salida:

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    550      31    55036      71256       2.81   1820   3 Spotify
    294      21    12328      18144       0.06  13536   3 Spotify
    476      64    96012     141208      20.61  13980   3 Spotify

Puedes usar el operador -notin para seleccionar valores que no están en la colección de objetos.

Por ejemplo, el siguiente ejemplo imprime todos los procesos que no tienen spotify como ProcessName.

Get-Process | where { $_.ProcessName -notin "spotify" }

De esta manera, puedes usar el cmdlet Where-Object para filtrar los objetos de la colección de objetos en función de sus valores de propiedad.

Crear condiciones de filtro con parámetros en PowerShell

Introducidos en Windows PowerShell 3.0, los parámetros tienen un flujo más natural en la forma en que se escriben. Usando el mismo ejemplo anterior, utilicemos parámetros para filtrar una salida específica.

Código de ejemplo:

Get-Service | Where-Object -Property StartType -EQ 'Automatic'

Nota que arriba, en lugar de usar un bloque de script, el comando especifica la propiedad del objeto como un valor del parámetro Property. Además, el operador -eq es ahora un parámetro, lo que permite pasarle el valor Automatic.

Usar parámetros de esta manera ahora elimina la necesidad de un bloque de script. Sin embargo, aunque Microsoft ha introducido parámetros como una forma más limpia de scripting, tenemos una excelente razón para usar bloques de script que discutiremos en la siguiente sección del artículo.

Usar múltiples declaraciones condicionales

Puedes combinar dos o más condiciones utilizando un operador (como -and o -or) para evaluarlas utilizando un bloque de script. Sin embargo, necesitamos usar un componente específico de Windows PowerShell llamado subexpresiones para evaluar cada condición con éxito.

En Windows PowerShell, podemos usar subexpresiones para ejecutar una expresión dentro de una sintaxis de filtrado como Where-Object. Hacemos esto encerrando cualquier declaración condicional que ejecutemos con paréntesis (()).

Código de ejemplo:

Get-Process | Where-Object { ($_.CPU -gt 2.0) -and ($_.CPU -lt 10) }

Ejemplo de bloque de script:

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
------ - ------    ---- - ---- - ------     --  -- ---------- -
334      21    18972      26384       5.23   3808   0 AnyDesk
635      34    13304      51264       9.56   4140   5 notepad
726      36    12820      51196       4.69  12088   5 notepad
802      46    18356      65088       7.98  10784   5 OneDrive
340      18     6472      26436       3.44   1252   5 RuntimeBroker
698      34    14672      44484       3.63   3284   5 RuntimeBroker
323      19     5732      23432       4.00  11200   5 RuntimeBroker
560      18     6440      27752       4.63   8644   5 sihost
632      31    21524      69972       2.81   6392   5 StartMenuExperienceHost
390      18     9756      30832       3.94   3084   5 svchost
523      24     8768      36312       2.17   6300   5 svchost
524      17     6416      21036       4.42  10932   5 SynTPEnh
525      22    15336      38904       3.41   2192   5 TextInputHost
¿Disfrutas de nuestros tutoriales? Suscríbete a DelftStack en YouTube para apoyarnos en la creación de más guías en vídeo de alta calidad. Suscríbete
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

Artículo relacionado - PowerShell Statement