Aprender PowerShell paso a paso – IV

Escrito por Saul Da Silva

17/02/2018

Filtrando Resultados (Where-Object)

El Cmdlet Where-Object nos da la capacidad de crear filtros específicos. Como te has dado cuenta la gran parte de los CMDLETS te muestran en la consola datos de un determinado objeto o recurso. Como por ejemplo Get-Service que nos mostrara todos los servicios que se estén ejecutando o estén detenidos. Muchas veces pasamos a traves de una canalización más objetos de los deseados y necesitamos filtrarlos antes del final de la canalización, para asi poder realizar acciones solo en un parte del grupo de objetos deseados.

Los bloques Where-Object utilizan la variable ‘$_’ para referirse al objeto actual de la canalización.  Por ejemplo mostremos una lista de valores y queremos que solo nos muestren los valores mayores que 20.

1,56,34,20,14,22,15,38 | Where-Object {$_ -gt 20}

Ahora vamos a filtrar los resultados del comando Get-Service y mostrar solo los servicios en ejecución.

Get-service | where-object {$_.Status –eq “Running”} 

Where-Object Cmdlet PowerShell

La estructura del cmdlet Where-Object es {_.Campo operador valor}

Los operadores de comparación de PowerShell son:

-lt Menor Que
-le Menor o Igual
-gt Mayor Que
-ge Mayor o Igual
-eq Igual
-ne No es Igual
-like Es Como
-notlike No es Como
-contains Contiene
-notcontains No Contiene

Estos operadores para los que no los conozcan son abreviaciones en inglés por ejemplo –gt “greater than”  -ge “greater equal” –ne  “not equal”

Cada cmdlet te mostrara diferentes resultados, por lo tanto en el momento de usar Where-Object debes conocer el resultado original del cmdlet. Por ejemplo vamos a introducir el cmdlet Get-ChildItem

 

PowerShell GET-CHILDITEM

Podemos apreciar que tenemos por defecto Mode, LastWriteTime, Lenght, Name

Ya que conocemos la salida por defecto de este comando puedes utilizar el filtro where-object {$_.Name –like “Do*”}

Como podéis ver hemos utilizado «Do*» ese comodín indica cualquier objeto que empieze por Do

Operadores Lógicos de PowerShell

-and Devuelve True si ambos valores son true
-or Devuelve True si cualquiera de los valores son True
-not Invierte True y False
! Invierte True y False

Repetir una tarea para varios Objetos (ForEach-Object)

El cmdlet Foreach-Object usa bloques de script y el descriptor $_ para el objeto de canalización actual con el fin de poder ejecutar un comando en cada objeto de la canalización.

Vamos a ver un ejemplo complejo para este cmdlet Get-WmiObject -Class Win32_LogicalDisk 

Como puedes ver nos devuelve el espacio libre y mas datos en bytes lo cual nos dificulta la lectura para convertirlo a MegaBytes podemos usar el siguiente cmdlet donde también utilizaremos Select-Object -Property Name,FreeSpace para mostrar las propiedades Name y FreeSpace en nuestro resultado y luego canalizamos e introducimos un ForEach-Object con el respectivo calculo para dividir el valor de FreeSpace y convertirlo a MegaBytes.

Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024/1024; $_}

Y obtendremos el siguiente resultado:

 

Hemos llegado al final de esta publicación en nuestra próxima publicación vamos con el scripting a fondo, espero os haya gustado.

 

 

Te puede interesar…

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *