Cómo filtrar objetos únicos en PowerShell con Where-Object
Recientemente, recibí el requisito de filtrar objetos únicos de una colección de datos en PowerShel. PowerShell proporciona el cmdlet Where-Object para filtrar objetos únicos o distintos de una colección. En este tutorial de PowerShell, explicaré cómo filtrar objetos únicos en PowerShell con el cmdlet Where-Object.
Para filtrar objetos únicos en PowerShell, puede usar el cmdlet Select-Object con el parámetro -Unique. Por ejemplo, Obtener-Proceso | Select-Object -Property ProcessName -Unique devolverá una lista de procesos con nombres distintos. Si necesita filtrar en función de varias propiedades, puede combinar Where-Object con un bloque de script personalizado o usar Group-Object para agrupar por propiedades y luego seleccionar grupos con un recuento de uno.
PowerShell donde-objeto distinto
El cmdlet Where-Object en PowerShell se usa para filtrar objetos según sus valores de propiedad. Le permite especificar un bloque de secuencia de comandos que determina si un objeto debe incluirse o no en la salida. El cmdlet evalúa cada objeto en la canalización y pasa por aquellos objetos que coinciden con la condición especificada.
Sin embargo, Where-Object por sí solo no proporciona directamente una forma de filtrar objetos únicos. Sería mejor si lo usara con frecuencia junto con otros cmdlets para lograr esto. El objetivo es recuperar objetos donde una propiedad particular o una combinación de propiedades es distinta.
Utilice Group-Object con Where-Object para obtener objetos únicos
Una forma de filtrar objetos únicos en PowerShell es utilizar el cmdlet Group-Object. Este cmdlet agrupa objetos que tienen el mismo valor para propiedades especificadas. Aquí hay un ejemplo básico:
$processes = Get-Process
$uniqueProcesses = $processes | Group-Object -Property ProcessName | Where-Object { $_.Count -eq 1 } | Select-Object -ExpandProperty Group
En este ejemplo, obtenemos una lista de procesos y luego los agrupamos por ProcessName. Luego usamos Where-Object para filtrar estos grupos solo aquellos que tienen un recuento de 1, lo que significa que son únicos. Finalmente, expandimos la propiedad Group para recuperar los objetos originales.
Puede ver el resultado en la siguiente captura de pantalla:
Combine Select-Object con Where-Object para obtener objetos distintos
También puede usar Select-Object con Where-Object para obtener objetos distintos en PowerShell. Aquí, puede utilizar Select-Object con su parámetro -Unique.
$uniqueProcesses = Get-Process | Select-Object -Property ProcessName -UniqueEsto devolverá objetos de proceso con propiedades ProcessName únicas directamente. Sin embargo, si necesita filtrar según una combinación de propiedades, es posible que aún necesite emplear Where-Object para ajustar sus resultados.
Filtrado avanzado con bloques de script personalizados
Para escenarios más complejos en los que es posible que desee filtrar en función de múltiples propiedades o lógica personalizada, puede utilizar un bloque de secuencia de comandos personalizado con Where-Object. Por ejemplo:
$uniqueItems = Get-Process | Where-Object {
$currentProcess = $_
-not ($processes | any { $_.Id -ne $currentProcess.Id -and $_.ProcessName -eq $currentProcess.ProcessName })
}En este bloque de secuencia de comandos, estamos verificando procesos con un ProcessName único que no tengan ningún otro proceso con el mismo nombre pero con un Id diferente.
Ordene y use Get-Unique para obtener objetos únicos en PowerShell
Otro método que puede utilizar para buscar objetos únicos en PowerShell implica ordenar los objetos primero y luego usar el cmdlet Get-Unique:
$sortedProcesses = Get-Process | Sort-Object -Property ProcessName
$uniqueProcesses = $sortedProcesses | Get-Unique -AsStringAquí, Get-Unique se utiliza después de ordenar los procesos por ProcessName. El parámetro -AsString se utiliza para comparar los valores de propiedad como cadenas, lo cual es necesario para objetos no primitivos.
Nota: Cuando se trabaja con grandes conjuntos de datos, el rendimiento puede convertirse en un problema. Es importante elegir el enfoque más eficiente para su escenario específico. Usar Select-Object -Unique es generalmente más rápido que agrupar objetos, especialmente cuando se trata de casos simples de unicidad basados en una sola propiedad.
Conclusión
El filtrado de objetos únicos en PowerShell requiere una combinación de cmdlets como Group-Object, Select-Object o un filtro personalizado Where-Object. Aquí, he explicado diferentes ejemplos para filtrar objetos únicos en sus scripts de PowerShell.
En este tutorial de PowerShell, he explicado cómo filtrar objetos únicos en PowerShell usando Where-Object.
- PowerShell donde-objeto distinto
- PowerShell donde-objeto único
