Cuando trabajas con valores de propiedad en una colección de objetos en PowerShell, a veces necesitarás una forma de filtrar todo lo que no necesitas. Saber cómo usar el cmdlet Where-Object
de PowerShell es una habilidad importante que debes tener en tu caja de herramientas de PowerShell.
El cmdlet Where-Object
es una forma práctica de filtrar objetos. En este tutorial, aprenderás diferentes formas de construir un comando Where-Object
, sus parámetros disponibles, sintaxis, así como cómo usar múltiples condiciones como un profesional.
Prerrequisitos
Solo hay un prerrequisito para este artículo. Debes tener cierta familiaridad básica con los comandos y la sintaxis de PowerShell.
Todos los ejemplos en este artículo se basarán en la versión estable actual de PowerShell (7.1.0 en el momento de escribir esto). Pero siempre que tengas Windows PowerShell 4.0 o superior, los comandos funcionarán de la misma manera.
Entendiendo cómo funciona el cmdlet Where-Object de PowerShell
El único objetivo del cmdlet Where-Object
de PowerShell es filtrar la salida que devuelve un comando para mostrar solo la información que deseas ver.
En pocas palabras, el cmdlet Where-Object
es un filtro; eso es todo. Te permite construir una condición que devuelve Verdadero o Falso. Dependiendo del resultado de esa condición, el cmdlet devuelve o no la salida.
Puedes crear esa condición de dos maneras; la “antigua” con bloques de script y la “nueva” usando parámetros o declaraciones de comparación.
Creando condiciones de filtro con bloques de script
Los bloques de script son un componente clave en PowerShell. Se utilizan en cientos de lugares en todo el lenguaje. Un bloque de script es una función anónima. Es una forma de compartimentar el código y ejecutarlo en varios lugares. Puedes construir un filtro para Where-Object
a través de un bloque de script.
Para usar un bloque de script como filtro, se utiliza el parámetro FilterScript
. Este parámetro te permite crear y pasar un bloque de script al parámetro FilterScript
que luego se ejecuta.
Si el bloque de script devuelve un valor que no sea un booleano Falso o una variable nula, se considera Verdadero. Si no, se considera Falso.
Por ejemplo, supongamos que necesitas encontrar todos los servicios de Windows que actualmente tienen un tipo de inicio de Automático. Primero recopilarías todos los servicios actuales con Get-Service
. Luego, Get-Service
devuelve muchos objetos de servicio diferentes con diversas propiedades.
Usando la canalización de PowerShell, luego podrías enviar esos objetos al cmdlet Where-Object
y utilizar el parámetro FilterScript
. Dado que el parámetro FilterScript
acepta un bloque de script, podrías crear una condición para verificar si la propiedad StartType
de cada objeto es igual a Automático como se muestra a continuación.
Una vez que tengas el bloque de script de filtrado, lo proporcionarías al parámetro FilterScript
. Where-Object
ejecutaría ese bloque de script para cada objeto que pase por la canalización y evaluaría cada propiedad StartType
. Si la propiedad es igual a Automático, Where-Object
pasaría el objeto. Si no, el objeto sería descartado.
Puedes ver un ejemplo sencillo de esta metodología a continuación.

Muchas personas utilizan parámetros posicionales con el cmdlet
Where-Object
y no incluyen el nombre del parámetroFilterScript
. En su lugar, simplemente proporcionan el bloque de script comoWhere-Object {$_.StartType -eq 'Automático'}
.
Aunque este tipo de construcción funciona para este escenario en particular, el concepto de un bloque de script con las llaves o incluso la variable de canalización $_
hace que el código sea menos legible y más difícil para los usuarios de PowerShell menos experimentados. Este problema de legibilidad es lo que llevó al equipo de PowerShell a introducir parámetros o declaraciones de comparación.
Declaraciones de comparación
Introducidos en Windows PowerShell 3.0, los statement de comparación tienen un flujo más natural en cuanto a cómo se construyen. Utilizando el mismo escenario que en el ejemplo anterior, vamos a utilizar la estructura de statement de comparación para encontrar todos los servicios de Windows con un tipo de inicio Automático:
Observa arriba que en lugar de utilizar un scriptblock, el comando especifica la propiedad del objeto como un valor de parámetro para el parámetro Property
. El operador eq
ahora también es un parámetro, lo que te permite pasar el valor Automático a él.
Usar parámetros de esta manera ahora elimina la necesidad de un scriptblock por completo.
A scriptblock is a better choice when defining more complex filtering conditions. The
Property
parameter may not always be the best choice. If using a scriptblock, just remember to document your code using comments!
En la siguiente sección, aprenderás sobre los tipos de operadores de comparación disponibles que se pueden utilizar con Where-Object
para filtrar todas las cosas.
Fundamentos de filtrado
Usando parámetros, Where-Object
filtra colecciones de objetos utilizando operadores de comparación comunes. Vamos a ver algunos ejemplos de cómo funcionan.
Operadores de Contención
Los operadores de contención son útiles cuando se trabaja con colecciones. Estos operadores permiten definir una condición si una colección contiene un elemento o no.
Como ejemplo, supongamos que quieres filtrar un valor de propiedad específico en una colección. Podrías utilizar operadores de contención.
En PowerShell, encontrarás algunos operadores de contención diferentes:
-contains
/-ccontains
– Filtra una colección que contiene un valor de propiedad.-notcontains
/-cnotcontains
– Filtra una colección que no contiene un valor de propiedad.-in
/-cin
– el valor está en una colección, devuelve el valor de propiedad si se encuentra una coincidencia.-notin
/-cnotin
– el valor no está en una colección,null
/$false
si no hay un valor de propiedad.
Para la sensibilidad a mayúsculas y minúsculas, utiliza operadores de contención que comienzan con -c[operador]
Relacionado: Comprender los operadores de comparación de PowerShell mediante ejemplos
Supongamos que deseas verificar el estado del servicio de Windows BITS. Puedes hacerlo utilizando el parámetro contains
(operador) pasando el valor de BITS como se muestra a continuación.
Y a continuación es lo que esperarías ver:

¡Recuerda siempre filtrar a la izquierda! El ejemplo anterior es equivalente a ejecutar
Get-Service -ServiceName 'BITS'
.
Tal vez quieras ser más elegante y encontrar todos los servicios con un Estado que no sea Ejecutándose y un Tipo de inicio que está en una cadena única (o podría ser un arreglo) llamada Manual. Usando un bloque de script a continuación, el comando utiliza el parámetro FilterScript
para pasar un bloque de script que evalúa ambas condiciones.
Relacionado: Volver a lo básico: Comprender los objetos de PowerShell
Cuando ejecutas el comando anterior, solo verás servicios que estén detenidos y tengan un StartType de Manual.

La filtración con operadores de contención funciona bien con colecciones que contienen muchos valores de propiedades. Dado el número de propiedades que devuelve Get-Service
, filtrar a través de todas estas propiedades se hace más fácil cuando combinas la contención y los operadores lógicos.
Operadores de coincidencia
Al igual que usas operadores de contención con Where-Object
, también puedes usar operadores de coincidencia. Los operadores de coincidencia te permiten buscar cadenas dentro de cadenas. Por ejemplo, 'foofoo' -like '*foo*'
devuelve Verdadero o 'foofoo' -match 'foo'
devuelve Verdadero. Los operadores de coincidencia buscan cadenas en cadenas.
En PowerShell, tienes varios operadores de coincidencia que puedes usar dentro de Where-Object
.
-like
/-clike
– la cadena coincide con un patrón de comodines.-notlike
/-cnotlike
– la cadena no coincide con el patrón de comodines.-match
/-cmatch
– la cadena coincide con un patrón regex.-notmatch
/-cnotmatch
– la cadena no coincide con un patrón regex.
Para la sensibilidad a mayúsculas y minúsculas, usa operadores de coincidencia que comiencen con
-c[operador]
Casi idénticos en forma a los operadores de contención, puedes usar operadores de coincidencia como se muestra a continuación. El siguiente ejemplo encuentra todos los servicios que tienen Windows en el valor de la propiedad DisplayName.

match
operator uses regular expressions to match on certain values.Relacionado: Introducción a PowerShell y Regex
También puedes usar el operador like
para utilizar técnicas comunes de coincidencia, como utilizar un comodín (*
) para coincidir con cualquier carácter o tal vez un ?
para coincidir con un solo carácter.
Los resultados ahora se filtran solo para aquellos nombres de servicio con ‘Win’ como los primeros tres caracteres:

Usar el comodín significa que no es necesario conocer el nombre completo del servicio. Solo se necesitan algunas letras de la cadena. Estos operadores también se pueden combinar con operadores lógicos para mejorar aún más el filtrado.
Operadores de igualdad
Al igual que con los operadores de contención y comparación, también puedes usar operadores de igualdad con Where-Object
. Los operadores de igualdad son útiles cuando se necesita comparar valores numéricos.
Por ejemplo, 1 -eq 1
sería Verdadero mientras que 1 -gt 2
sería Falso. PowerShell tiene muchos operadores de igualdad diferentes que puedes usar como parámetros de Where-Object
o dentro de bloques de script de condición.
-eq
/-ceq
– valor igual al valor especificado.-ne
/-cne
– valor no igual al valor especificado.-gt
/-cgt
– valor mayor que el valor especificado.-ge
/-cge
– valor mayor o igual al valor especificado.-lt
/-clt
– valor menor que el valor especificado.-le
/-cle
– valor menor o igual al valor especificado.
Por ejemplo, tal vez quieras encontrar todos los procesos en ejecución que estén utilizando entre el dos y el diez por ciento de la CPU. No hay problema con los cmdlets Get-Process
y Where-Object
de PowerShell.
Usando un scriptblock, puedes combinar dos condiciones utilizando el operador and
que las evaluará a ambas. Si ambas devuelven Verdadero, Where-Object
devuelve el objeto de proceso pasado por la canalización. Si al menos una de las condiciones devuelve Falso, Where-Object
descarta el objeto.
Aquí tienes lo que esperarías ver:

La filtración utilizando los operadores de igualdad de Where-Object
te ayudará a crear informes del sistema o comparar valores.
Siguientes pasos
Ahora que sabes más sobre cómo usar el cmdlet Where-Object
en PowerShell para filtrar todas las cosas, ¿qué más puedes hacer? Intenta realizar tareas de filtrado más complejas utilizando múltiples condiciones y operadores en colecciones para filtrar los valores de las propiedades y formatear la salida según tu preferencia.
Source:
https://adamtheautomator.com/powershell-where-object/