Puntos clave
- Sintaxis básica de filtrado: canaliza la salida del comando hacia Where-Object y usa operadores de comparación (como -eq, -gt o -lt) para filtrar los objetos por el valor de sus propiedades.
- Filtrado con bloques de script: usa bloques de script {} y $_ para aplicar una lógica más compleja, como varias condiciones, coincidencia de patrones o comparaciones calculadas.
- Varios valores y expresiones regulares: filtra por varios valores con arrays y operadores como -contains, o aplica expresiones regulares con -match para un filtrado avanzado de cadenas.
- Filtrado por fechas: compara propiedades DateTime (por ejemplo, LastWriteTime o TimeGenerated) con Get-Date para filtrar objetos dentro de intervalos de tiempo concretos.
- Tareas reales de automatización: aplica Where-Object a escenarios habituales de administración, como limpiar archivos antiguos, identificar procesos que consumen muchos recursos, filtrar usuarios de AD y buscar en los registros de eventos.
- Buenas prácticas de rendimiento: filtra a la izquierda usando los parámetros -Filter propios de cada cmdlet cuando estén disponibles, simplifica las condiciones y usa Measure-Command para detectar filtros lentos.
PowerShell es una línea de comandos y un lenguaje de scripting para la administración de sistemas y la automatización en Windows, y resulta imprescindible en el kit de herramientas de cualquier administrador o desarrollador de Windows. Filtrar la salida de los comandos de PowerShell con Where-Object te permite encontrar rápidamente los datos relevantes para mostrarlos, o bien ejecutar operaciones sobre un subconjunto de objetos según tus criterios de filtrado.
Esta guía explica cómo usar Where-Object para filtrar objetos y datos en PowerShell, e incluye ejemplos prácticos que puedes copiar y pegar en tu propio código. También aborda las consideraciones de rendimiento y las prácticas recomendadas para usar Where-Object en tus scripts de PowerShell.
💡 Puedes seguir este proceso de forma visual en nuestra guía en vídeo: Cómo filtrar datos con Where-Object en PowerShell.
Qué hace el cmdlet Where-Object de PowerShell
El CmdLet Where-Object de PowerShell (un CmdLet es un comando de PowerShell que se usa para la automatización) filtra una colección de objetos devuelta por un comando y deja solo los que coinciden con tus criterios de búsqueda.
La sintaxis y los parámetros más habituales de Where-Object son los siguientes:
[ Command ] | Where-Object [ -Property ] [ -Value ] [ Operator ]
Ten en cuenta que:
- [ Command ] es el comando cuya salida filtra Where-Object.
- [ -Property ] es la propiedad del objeto que se va a comparar, indicada como cadena.
- [ -Value ] es el valor con el que se compara la propiedad, indicado como objeto o cadena.
- El último parámetro es el [ Operator ] de comparación que se va a usar: -eq (igual a), -ne (distinto de), -gt (mayor que), -lt (menor que), -ge (mayor o igual que), -le (menor o igual que).
La salida se envía por canalización a Where-Object. Puedes consultar otras opciones de sintaxis en la documentación de PowerShell. También es posible indicar tus propios criterios de filtrado más complejos mediante un bloque de código, como se muestra en los ejemplos más adelante en este artículo.
Ejemplos prácticos de Where-Object para filtrar objetos
La mejor forma de entender cómo usar Where-Object es verlo en acción. A continuación tienes varios ejemplos sencillos con el uso básico de los operadores de comparación integrados y un uso avanzado que aplica criterios personalizados en bloques de script. Estos ejemplos incluyen cómo filtrar por varios valores, cómo usar expresiones regulares y cómo filtrar por fecha.
Después encontrarás varios comandos completos de PowerShell que utilizan Where-Object para realizar tareas de scripting habituales, como limpiar archivos de registro, localizar procesos con un consumo de memoria elevado, filtrar usuarios de Active Directory y buscar en los registros de eventos.
Filtrar por un único valor
Este ejemplo muestra cómo filtrar por un único valor con el operador de comparación -eq:
# Filtra los procesos en ejecución para quedarse con los que se llaman ‘powershell’
Get-Process | Where-Object Name -eq ‘powershell’
Filtrar por varios valores
Este ejemplo muestra cómo filtrar por varios valores. Filtra la lista de procesos en ejecución de Get-Process para quedarse con los llamados «winlogon» y «explorer» (ambos deberían estar en ejecución para cada usuario con sesión iniciada):
# Filtra los procesos en ejecución llamados ‘winlogon’ o ‘explorer’$names = @('winlogon', 'explorer') # Define un array con los distintos valores de búsqueda
Get-Process | Where-Object { $names -contains $_.Name }
Las llaves de este ejemplo delimitan un bloque de script de PowerShell que contiene un conjunto de expresiones. Fíjate también en el uso de $_, un atajo que representa el objeto que se está comparando. En este caso, sirve para pasar la propiedad Name del objeto a la comparación.
Usar expresiones regulares
Where-Object también se puede usar con arrays. Las expresiones regulares permiten filtrar cualquier tipo de objeto y añadir condiciones complejas para filtrar por el contenido de las cadenas:
# Filtra un array de correos electrónicos para quedarse con los de un dominio concreto$emailAddresses = @("[email protected]", "[email protected]", "[email protected]") # Define un array de direcciones de correo
$emailAddresses | Where-Object { $_ -match ‘@test.com$’ }
Ten en cuenta que también podrías usar el método Where() de los arrays, del que hablamos más adelante en este artículo.
Filtrar por fecha
En los comandos que devuelven objetos con propiedades de fecha, puedes filtrar usando los objetos DateTime que devuelve Get-Date:
# Busca archivos del directorio actual modificados en los últimos 14 días
Get-ChildItem -Path . | Where-Object { $_.LastWriteTime -GT (Get-Date).AddDays(-14) }
También puedes filtrar entre fechas indicando un intervalo:
# Busca entradas del registro de eventos de Windows de la última semana
$startDate = (Get-Date).AddDays(-7) # Fíjate en el número negativo para situar la fecha en el pasado
$endDate = Get-Date
Get-EventLog -LogName Application | Where-Object { $_.TimeGenerated -ge $startDate -and $_.TimeGenerated -le $endDate }
Ejemplos avanzados con criterios personalizados en bloques de script
Como se ve en los ejemplos anteriores, los bloques de script pueden contener varias expresiones de comparación. Puedes aplicar filtros más complejos con Where-Object si indicas varios criterios y condiciones en bloques de script. Aquí tienes algunos ejemplos:
# Filtra los procesos con un uso de CPU superior al 75 %
Get-Process | Where-Object { $_.CPU -gt 75 }
# Busca los servicios en ejecución cuyo nombre empiece por ‘Win’
Get-Service | Where-Object { $_.Status -eq ‘Running’ -and $_.Name -like ‘Win*’ }
# Busca archivos del directorio actual que pesen más de 3 MB y se hayan modificado en los últimos 30 días
Get-ChildItem -Path . | Where-Object { $_.Length -gt 3MB -and $_.LastWriteTime -gt (Get-Date).AddDays(-30) }
Ejemplos habituales de Where-Object en el día a día
Además de los ejemplos anteriores, aquí tienes otros comandos de PowerShell que suelen hacer falta en tareas de automatización y administración de sistemas:
# Busca archivos .txt en el directorio actual
Get-ChildItem -Path . | Where-Object Extension -eq ‘.txt’
# Elimina los archivos de registro de una ruta concreta con más de 90 días
Get-ChildItem -Path ‘C:PathToLogs’ -Filter ‘*.log’ | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-90) } | Remove-Item
# Lista los procesos que usan más de 1000 MB de memoria
Get-Process | Where-Object { $_.WorkingSet -gt 1000MB } | Select-Object Name, WorkingSet
# Busca usuarios de Active Directory que pertenezcan a un grupo concreto (marketing) y tengan un puesto concreto (Director)
Import-Module ActiveDirectory
Get-ADUser -Filter { MemberOf -eq ‘CN=Marketing,OU=Groups,DC=example,DC=com’ -and Title -eq ‘Director’ }
# Busca entradas del registro de eventos de Windows que sean errores relacionados con una aplicación concreta (MyApplication)
Get-EventLog -LogName Application -EntryType Error | Where-Object { $_.Source -eq ‘MyApplication’ }
Fíjate en que en este ejemplo se combinan Where-Object y Select-Object para extraer los datos relevantes de los resultados.
Diferencias entre Where-Object y otros métodos de filtrado
En PowerShell hay varias formas de filtrar datos: unas están pensadas para objetos y otras para texto. No se comportan igual, así que conviene elegir la que mejor encaje en cada escenario:
- Where-Object: filtra las colecciones de objetos que se canalizan al comando para dejar solo los que coinciden.
- Select-Object: además puede filtrar propiedades de los objetos; por ejemplo, devolver una colección de objetos incluyendo solo la propiedad «name» de cada uno.
- Método Where() de los arrays: filtra arrays según las condiciones indicadas.
- Parámetro Filter: algunos cmdlets incluyen un parámetro -Filter para buscar en su salida.
Consideraciones de rendimiento al filtrar datos
Filtrar datos puede consumir muchos recursos. Los comandos de PowerShell, sobre todo cuando interactúan con bases de datos o con Active Directory, pueden devolver miles de registros, y usar Where-Object para procesar y filtrar cada uno no es la forma más eficiente de buscar en grandes volúmenes de datos.
Muchos comandos de PowerShell incluyen un parámetro -Filter optimizado para las búsquedas con ese comando. Si hay un parámetro -Filter disponible, lo recomendable es usarlo para reducir los datos lo máximo posible antes de pasarlos a Where-Object.
Por ejemplo, si trabajas con datos de Active Directory mediante el Get-ADUser, y quieres obtener la lista de usuarios de un departamento concreto para después ejecutar acciones distintas según su puesto, deberías usar -Filter para limitar los resultados a ese departamento. Luego puedes usar Where-Object para ejecutar las acciones según el puesto sobre esa lista de objetos más reducida.
Si tu script de PowerShell tarda demasiado en ejecutarse y sospechas que la culpa es de un comando que contiene Where-Object, puedes evaluar su rendimiento con el cmdlet Measure-Command, que mide el tiempo que tarda el comando en completarse.
Prácticas recomendadas y errores habituales al usar Where-Object en PowerShell
Hay algunos errores habituales al usar Where-Object que se pueden evitar con estas prácticas recomendadas:
- «Filtrar a la izquierda»: usa el parámetro -Filter específico del cmdlet u otros parámetros de búsqueda lo antes posible en tus comandos de PowerShell (es decir, lo más a la izquierda posible) para maximizar la eficiencia.
- Usa Select-Object para descartar las propiedades que no necesitas: mejora el rendimiento cuando se manejan grandes volúmenes de datos (que no puedes filtrar de otro modo con funciones propias del cmdlet).
- Simplifica: evita las condiciones complejas en los bloques de script y divide el trabajo siempre que puedas para mejorar el rendimiento y facilitar la depuración.
- Usa bien los operadores de comparación: asegúrate de entender qué hacen tus parámetros de filtrado y tus bloques de script para evitar resultados inesperados.
- Mantén tus scripts legibles: puedes usar ? como alias de Where-Object para acortar los comandos y hacerlos más fáciles de leer. Conviene además usar espacios en blanco y sangría para que el código quede bien formateado y se lea con facilidad, y añadir comentarios que indiquen qué hace cada línea del script (por si vuelves a él meses o años después para ajustar algo y ya no recuerdas para qué servía un comando).
Para depurar los comandos con Where-Object, puedes usar el parámetro común verbose de PowerShell y mostrar información detallada de la operación en curso. Por ejemplo:
$VerbosePreference = "Continue"
Get-Process | Where-Object { $_.CPU -gt 75 } -Verbose
También deberías usar bloques try-catch para gestionar los errores inesperados de forma controlada.
Filtrar datos con Where-Object en PowerShell te permite mostrar la información relevante de los cmdlets, buscar archivos y procesos y ordenar los resultados de cualquier comando de PowerShell que devuelva objetos, incluidas las herramientas para trabajar con Active Directory. Para ver cómo Where-Object puede ayudarte con las tareas repetitivas de administración de sistemas, echa un vistazo a nuestro tutorial sobre cómo usar PowerShell para la automatización.
