Objeto Dónde de PowerShell - Guía completa
PowerShell Where-object es un comando muy importante que utiliza con frecuencia para filtrar datos de manera eficiente. Permite a los usuarios filtrar objetos de una colección según criterios específicos, trabajando de manera similar a las cláusulas SQL 'WHERE' o los métodos LINQ en .NET. En este tutorial, aprenderá todo sobre PowerShell Where-Object con ejemplos.
Where-Object en PowerShell es un comando que se utiliza para filtrar objetos en función de sus propiedades o expresiones. Le permite especificar condiciones que deben cumplir los objetos, devolviendo solo aquellos que coincidan con los criterios. Este cmdlet se usa comúnmente en canalizaciones para refinar la salida de los comandos, lo que facilita el trabajo con los datos exactos que necesita.
Comprender el objeto Dónde en PowerShell
Where-Object en PowerShell filtra objetos de una colección según condiciones específicas. A menudo se utiliza en proceso para permitir a los usuarios procesar solo elementos que cumplen ciertos criterios.
La sintaxis de Where-Object incluye un bloque de script en el que se definen las condiciones para filtrar objetos. El bloque de secuencia de comandos puede contener una o más condiciones, y solo los objetos que cumplan todas las condiciones se transmitirán por la canalización. A continuación se muestra un ejemplo de su sintaxis:
Get-Process | Where-Object { $_.CPU -gt 100 }En este ejemplo, Get-Process genera una lista de procesos en ejecución y Where-Object filtra esta lista para devolver solo los procesos que consumen más de 100 unidades de tiempo de CPU.
Aquí puede ver el resultado en la siguiente captura de pantalla:
Características importantes de Where-Object:
- Filtrado eficaz: al filtrar objetos en el lado izquierdo de la canalización,
Where-Objectmejora la eficiencia al reducir la cantidad de datos que se pasan a lo largo de la canalización. - Flexibilidad: acepta expresiones complejas, lo que permite a los usuarios realizar un filtrado detallado y matizado.
- Versatilidad: se puede utilizar con cualquier cmdlet de PowerShell que envíe objetos a la canalización.
Where-Object juega un papel crucial en las secuencias de comandos de PowerShell efectivas, especialmente cuando se manejan grandes conjuntos de datos o se realizan operaciones que involucran tareas que consumen muchos recursos. La capacidad de filtrar temprano (filtrar a la izquierda) maximiza el rendimiento al reducir la cantidad de objetos pasados a cmdlets posteriores en la canalización.
Uso básico de PowerShell Where-Object
El cmdlet Where-Object de PowerShell es un comando potente y flexible que se utiliza para filtrar objetos de una colección según condiciones específicas. Por lo general, se utiliza en la canalización para seleccionar objetos con ciertos atributos o que satisfacen un conjunto particular de criterios.
Sintaxis
La sintaxis básica del cmdlet Where-Object es sencilla. Se necesita un bloque FilterScript, que es un bloque de secuencia de comandos que evalúa cada objeto en la canalización y devuelve True si el objeto debe incluirse en la salida. La sintaxis se puede expresar como:
Where-Object {<FilterScript>}Por ejemplo, si un usuario desea recuperar una lista de servicios que se están ejecutando actualmente, puede usar el siguiente comando:
Get-Service | Where-Object {$_.Status -eq 'Running'}En este caso, $_ representa cada objeto pasado a Where-Object desde la canalización, y -eq es el operador de igualdad.
Bloque FilterScript
Un bloque FilterScript es un conjunto de condiciones definidas en un bloque de script {} que filtra objetos. El bloque de secuencia de comandos recibe cada objeto de la canalización y utiliza operadores de comparación para evaluarlo, lo que produce un resultado booleano ($True o $False).
Sintaxis:
{ $_.<PropertyName> -<Operator> <Value> }
Los operadores incluyen:
-eq: es igual-ne: no es igual-gt: mayor que-lt: menos de-ge: mayor o igual-le: menor o igual
Ejemplo:
Para seleccionar archivos de más de 1 MB, se puede utilizar el siguiente FilterScript:
Get-ChildItem | Where-Object {$_.Length -gt 1MB}La propiedad Longitud almacena el tamaño del archivo y el operador -gt se utiliza para compararlo con 1 MB. Si la condición devuelve True, el objeto se incluye en la salida.
Operadores de comparación
El cmdlet Where-Object de PowerShell aprovecha los operadores de comparación para evaluar condiciones y filtrar objetos.
Operadores de comparación estándar
Los operadores de comparación estándar en PowerShell realizan comparaciones sin distinguir entre mayúsculas y minúsculas de forma predeterminada. Esto significa que al comparar dos valores no se considera el caso de los caracteres. Los operadores comunes incluyen:
-eq: es igual-ne: no es igual-gt: mayor que-lt: menos de-ge: mayor o igual a-le: menor o igual a
Aquí está la sintaxis estándar para una declaración de comparación:
\$Object | Where-Object { $_.Property -Operator Value }Por ejemplo,
Get-Process | Where-Object { $_.PriorityClass -eq "Normal" }Esto enumerará los procesos con una clase normal de prioridad, independientemente de si "Normal" está en mayúscula en el valor de propiedad original.
Operadores de comparación que distinguen entre mayúsculas y minúsculas
Cuando la distinción entre mayúsculas y minúsculas es un requisito, PowerShell proporciona variantes que distinguen entre mayúsculas y minúsculas de sus operadores de comparación. Estos operadores tienen el prefijo "c" para indicar que distinguen entre mayúsculas y minúsculas. La lista incluye:
-ceq: distingue entre mayúsculas y minúsculas-cne: distingue entre mayúsculas y minúsculas y no es igual-cgt: distingue entre mayúsculas y minúsculas mayor que-clt: distingue entre mayúsculas y minúsculas menos que-cge: distingue entre mayúsculas y minúsculas mayor o igual que-cle: distingue entre mayúsculas y minúsculas menor o igual que
La utilización de estos operadores requiere una intención explícita de comparar valores prestando atención a la distinción entre mayúsculas y minúsculas. Un ejemplo de una declaración de comparación que distingue entre mayúsculas y minúsculas:
Get-Service | Where-Object { $_.Status -ceq "Running" }Este comando recupera solo los servicios cuyo estado coincide exactamente con "En ejecución" con distinción entre mayúsculas y minúsculas, excluyendo aquellos etiquetados como "en ejecución" o "EN EJECUCIÓN".
Usar comodines y expresiones regulares
Cuando se utiliza el comando Where-Object de PowerShell, los comodines y las expresiones regulares ofrecen flexibilidad para filtrar la salida. Mejoran significativamente las capacidades de coincidencia de patrones.
Los operadores -Like y -NotLike
Los operadores -Like y -NotLike en PowerShell permiten al usuario comparar una cadena con un patrón mediante comodines. El comodín más común es el asterisco *, que representa cualquier número de caracteres. Un comodín de signo de interrogación ? representa un solo carácter.
Por ejemplo:
Get-Process | Where-Object { $_.Name -Like 's*' }Este comando filtra procesos cuyos nombres comienzan con la letra 's'.
Por el contrario, -NotLike excluye los elementos que coinciden con el patrón:
Get-Service | Where-Object { $_.DisplayName -NotLike '*Network*' }Este comando enumera todos los servicios que no contienen la palabra "Red" en su nombre para mostrar.
Los operadores -Match y -NotMatch
Los operadores -Match y -NotMatch en PowerShell usan expresiones regulares para una coincidencia de patrones más compleja. Las expresiones regulares, o expresiones regulares, son secuencias de caracteres que forman un patrón de búsqueda. Se pueden utilizar para comprobar si una cadena contiene una secuencia específica de caracteres.
Por ejemplo:
Get-Process | Where-Object { $_.Name -Match '^s.*' }Este comando selecciona procesos cuyos nombres comienzan con 's' (^ denota el inicio de una cadena en expresiones regulares).
Alternativamente, -NotMatch filtra cadenas que cumplen con los criterios de expresiones regulares:
Get-Process | Where-Object { $_.Name -NotMatch 'svc$' }Esto recopila procesos cuyos nombres no terminan en 'svc' ($ denota el final de una cadena en expresiones regulares).
Filtros avanzados usando PowerShell Where-Object
Cuando se trabaja con PowerShell, las técnicas avanzadas de secuencias de comandos a menudo requieren bloques de secuencias de comandos y operadores lógicos para crear filtros más complejos. Estos métodos mejoran las capacidades de Where-Object para gestionar y manipular objetos de forma eficaz.
Uso de bloques de script para filtros complejos
Los bloques de secuencias de comandos son fundamentales en las secuencias de comandos avanzadas de PowerShell. Permiten a los usuarios especificar condiciones más sofisticadas al filtrar objetos. Un bloque de secuencia de comandos se indica mediante llaves {} y puede contener una secuencia de comandos de PowerShell. Cuando se utilizan con Where-Object, los bloques de script permiten la evaluación de expresiones complejas, lo que facilita potentes mecanismos de filtrado.
Por ejemplo:
Get-Process | Where-Object { $_.CPU -gt 100 -and $_.ProcessName -eq "notepad" }En este comando, el bloque de script filtra procesos con un uso de CPU superior a 100 y un nombre de proceso de "bloc de notas".
Encadenando múltiples condiciones
El encadenamiento de condiciones es un método para aplicar una serie de filtros utilizando operadores lógicos como -and, -or y -not. Esto permite un enfoque matizado para filtrar objetos, donde se pueden combinar múltiples criterios en una sola consulta. El uso eficaz de estos operadores puede conducir a resultados más selectivos y precisos.
Ejemplo con múltiples condiciones encadenadas:
Get-Service | Where-Object { $_.Status -eq "Running" -and ($_.StartType -eq "Automatic" -or $_.StartType -eq "Manual") }Este comando selecciona servicios que se están ejecutando actualmente y tienen un tipo de inicio Automático o Manual, lo que demuestra el uso de los operadores -and y -or dentro de un bloque de secuencia de comandos para crear un filtro complejo.
Utilizando tuberías y objetos
En PowerShell, las canalizaciones permiten pasar objetos de un cmdlet a otro, lo que facilita la manipulación de datos simplificada. El cmdlet Where-Object es fundamental para filtrar objetos dentro de este flujo de trabajo.
Filtrar objetos con Get-Command
El cmdlet Get-Command de PowerShell recupera una lista de todos los comandos disponibles en la sesión. Cuando se usa dentro de una canalización, Where-Object puede filtrar estos comandos según criterios específicos. Por ejemplo:
Get-Command | Where-Object { $_.CommandType -eq 'Cmdlet' }Este comando enumera todos los cmdlets disponibles para el usuario. Where-Object emplea bloques de script, { }, que contienen condiciones que filtran la salida de Get-Command según el CommandType propiedad.
Combinando Where-Object con ForEach-Object
Para una mayor manipulación de los objetos filtrados, se puede combinar Where-Object con ForEach-Object. Esto permite la ejecución de un bloque de secuencia de comandos en cada elemento del proceso.
Get-Command | Where-Object { $_.CommandType -eq 'Function' } | ForEach-Object { $_.Name }Esta secuencia recupera todas las funciones de PowerShell y luego las canaliza a ForEach-Object, que extrae el nombre de cada función. Al encadenar estos cmdlets, se pueden filtrar los datos y luego actuar sobre ellos de manera eficiente.
El uso de Select-Object junto con estos cmdlets puede ayudar a seleccionar propiedades de objetos específicas, lo que refina aún más la salida. Además, el uso de alias puede acortar los comandos, haciéndolos concisos; por ejemplo, foreach es un alias para ForEach-Object y ? es un alias para Where-Object. Es importante tener en cuenta que, si bien los alias pueden acelerar la escritura de comandos, su uso en scripts puede reducir la legibilidad y el mantenimiento.
Trabajar con tipos de objetos específicos en Where-Object
El cmdlet Where-Object de PowerShell sirve como una herramienta versátil para filtrar objetos de tipos específicos, como archivos, directorios, procesos y servicios. Al utilizar sus capacidades, se pueden consultar y administrar los recursos del sistema de manera eficiente.
Filtrar archivos y directorios
En PowerShell, Get-ChildItem se combina comúnmente con Where-Object para filtrar archivos y directorios según propiedades como nombre, fecha y LastWriteTime. Por ejemplo, para recuperar archivos modificados durante la última semana, se podría utilizar:
Get-ChildItem -Path C:\ -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) }
Listar archivos filtrados por extensión se puede lograr de la siguiente manera:
Get-ChildItem -Path C:\*.txt -RecurseEnumera todos los archivos de texto en la unidad C:.
- `…
Donde-Objeto { $_.Name -like 'informe' }`
Encontrar directorios vacíos se convierte en una cuestión de comprobar los atributos del objeto:
Get-ChildItem -Path C:\ -Recurse | Where-Object { $_.PSIsContainer -and $_.GetFiles().Count -eq 0 }Trabajar con procesos y servicios
Al filtrar procesos, Get-Process junto con Where-Object permite la lista de procesos por estado o nombre. Por ejemplo, para buscar procesos activos con un nombre específico:
Get-Process | Where-Object { $_.Name -eq 'notepad' }Los servicios se gestionan mediante Get-Service. Se pueden filtrar por Status o StartType:
Get-Service | Where-Object { $_.Status -eq 'Running' }Para mostrar servicios configurados para iniciarse automáticamente pero actualmente detenidos:
- Status
Es igual a "detenido"
- StartType
Es igual a "automático"
El filtrado de resultados se basa eficazmente en comprender las propiedades de los objetos en cuestión y construir expresiones de comparación precisas.
Mejores prácticas para usar PowerShell Where-Object
Al utilizar Where-Object en PowerShell, los usuarios deben seguir un conjunto coherente de mejores prácticas para garantizar un rendimiento y una legibilidad óptimos.
En primer lugar, deben ser concisos en el uso de los bloques de guiones. Usar {} significa un bloque de secuencia de comandos, que es una herramienta poderosa, pero cuando se usa en exceso puede provocar una disminución del rendimiento. Preferir -Filter cuando esté disponible puede ser más eficiente ya que opera del lado del proveedor.
En sus consultas, los usuarios deben ser específicos con los parámetros para evitar confusiones. Los parámetros con nombre ofrecen claridad, especialmente cuando una función acepta múltiples parámetros. Fomentan el código autodocumentado, lo que facilita su comprensión para otros.
El uso consistente de parámetros comunes puede mejorar los scripts. Los parámetros comunes como -Verbose y -ErrorAction proporcionan información adicional que puede ser invaluable para la depuración y el registro.
Una tabla para resaltar los parámetros clave:
-EQRepresenta la igualdad
-LT,-GTDenotan menor que y mayor que respectivamente
-ContainsComprueba si una colección contiene un elemento específico.
-LikePermite la coincidencia de comodines
No distinguir entre mayúsculas y minúsculas es el comportamiento predeterminado en PowerShell, lo que ayuda a los usuarios que trabajan en diferentes plataformas y sistemas. Esto mejora la portabilidad y reduce los problemas relacionados con la distinción entre mayúsculas y minúsculas.
Por último, siempre deben pasar los objetos por la tubería con cuidado. Encadenar Where-Object puede ser una forma útil de filtrar resultados, pero una sobreabundancia de comandos encadenados puede afectar la legibilidad y el rendimiento. Deben esforzarse por lograr un equilibrio entre secuencias de comandos funcionales y un código claro y fácil de mantener.
Ejemplos de objetos donde de PowerShell
Cuando se trabaja con Windows PowerShell 3.0, Where-Object sirve como un filtro indispensable para los flujos de datos de PowerShell. Aplica condiciones a los objetos que pasan por la tubería, lo que permite a los usuarios aislar elementos de interés. A continuación se muestran aplicaciones prácticas de Where-Object con varios operadores de comparación:
- Para enumerar todos los servicios que están actualmente detenidos, se puede usar:
Get-Service | Donde-Objeto { $_.Status -eq 'Detenido' }
- Para enumerar todos los servicios que están actualmente detenidos, se puede usar:
- Podemos identificar archivos modificados hace más de 30 días con el método
AddDays, junto con-lt(menos que):Get- Artículo secundario | Donde-Objeto { $_.LastWriteTime -lt (Get-Date).AddDays(-30) }
- Podemos identificar archivos modificados hace más de 30 días con el método
- Para buscar procesos que utilicen más de 100 MB de memoria se utiliza
-gt(mayor que):Get-Process | Donde-Objeto { $_.WS -gt 100MB }
- Para buscar procesos que utilicen más de 100 MB de memoria se utiliza
- Las condiciones agravantes pueden implicar enumerar los usuarios creados en el último año pero no modificados recientemente:
Get-ADUser | Donde-Objeto { $_.whenCreated -gt (Get-Date).AddDays(-365) -y $_.whenChanged -eq $_.whenCreated }
- Las condiciones agravantes pueden implicar enumerar los usuarios creados en el último año pero no modificados recientemente:
- Para eliminar elementos de una colección que no coinciden con una condición:
$colección | Donde-Objeto { $_ -ne "unwantedValue" }
- Para eliminar elementos de una colección que no coinciden con una condición:
Preguntas frecuentes
¿Cómo puedo utilizar varias condiciones con el cmdlet Where-Object en PowerShell?
Se integran varias condiciones en un único cmdlet Where-Object mediante operadores lógicos. -and, -or y -not permiten la combinación de varias expresiones para refinar el filtrado.
¿Puede proporcionar un ejemplo del uso de Where-Object en un comando de PowerShell?
Ciertamente. Para filtrar procesos con más de 100 MB de uso de memoria, se puede usar:
¿Cuál es la mejor manera de filtrar cadenas que contienen una subcadena específica usando Where-Object?
Para filtrar cadenas que contienen una subcadena específica, el operador -like normalmente se utiliza junto con caracteres comodín: | Donde-Objeto {$_ -like "*substring*"}.
¿Cómo selecciono objetos que comienzan con una determinada cadena en PowerShell usando Where-Object?
Se seleccionan objetos que comienzan con una cadena especificada aplicando el operador -like con el patrón apropiado: | Donde-Objeto {$_ -like "string*"}.
¿Cuál es el método para verificar la presencia de un elemento en una matriz usando Where-Object?
Para comprobar la presencia de un elemento en una matriz, utilice el operador -contains o -in: $array -contains 'item' o 'elemento' -en $matriz.
¿Cómo funciona la funcionalidad "comienza con" y "en la lista" con Where-Object en PowerShell?
La funcionalidad "comienza con" utiliza -like junto con un sufijo comodín, y "in list" aprovecha el operador -contains para evaluar si la matriz incluye el elemento especificado.
Conclusión
El cmdlet Where-Object permite a los usuarios filtrar objetos según criterios específicos.
- Acepta entradas directamente desde la canalización o mediante el parámetro
-InputObject. - Utiliza bloques de script
{}para definir condiciones.
Puntos clave:
- Versatilidad:
Where-Objectpuede manejar varios operadores de comparación (-eq,-gt,-lt, etc.). - Rendimiento: para conjuntos de datos grandes, utilizar el método
.where()en colecciones puede ofrecer beneficios de rendimiento. - Bloques de script: se pueden aplicar condiciones complejas mediante bloques de script, lo que proporciona una forma sólida de filtrar resultados.
Uso efectivo:
- Mantenga las condiciones lo más simples posible.
- Para obtener un rendimiento óptimo, filtre lo antes posible en la canalización.
- Recuerde combinar condiciones con operadores lógicos (
-and,-or) para un control refinado.
Ejemplo de uso:
Get-Process | Where-Object {$_.CPU -gt 100}En esta línea de código, Where-Object filtra procesos que consumen más de 100 unidades de CPU.
Espero que con este tutorial tengas una idea completa de cómo usar el objeto Where de PowerShell.
