Home Windows PowerShell – Pipelines, uso simple

PowerShell – Pipelines, uso simple

by José Luis Sánchez Borque

Un concepto fundamental en las shell’s en general son las pipelines. Un gran nombre para un concepto simple.

Una serie de comandos donde la salida de uno, es la entrada del siguiente

La potencia de la pipelines nos permitirar generar scripts complejos.

Veamos un ejemplo muy sencillo. El cmdlet Get-Process genera una lista de los procesos actuales en el sistema.

PS C:\> Get-Process

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------   ---- ----------- 
     48       5      732       3092    30     0,09   1404 conhost 
     57       5      772       3052    30     0,05   1428 conhost
     62       7     1052       4420    57     0,00   3688 conhost
    328      14     1848       4080    49     0,30    372 csrss
    167      15     1668      14056    55     0,23    448 csrss
    334      31    15052      17728   627     1,02   1564 dfsrs
    126      12     1756       4224    32     0,03   1956 dfssvc                             
    200      13     3368      10620    49     0,09   2788 dllhost
   5320    8928    95100       6716   148     0,73   1616 dns
    188      18    19088      27696   125     2,33    848 dwm
   1021      53    28452      64920   374     1,31   1968 explorer
     99      11     1640       2572    28     0,03   1632 ismserv
   1416     193    52256      46920  1187     2,09    544 lsass

Si queremos por ejemplo ordenar la salida de la información podemos utilizar el cmdlet “Sort-Object. Vemos en el siguiente ejemplo como la información aparece ordenada de forma descendente por uso de CPU.

PS C:\> Get-Process | Sort-Object -Descending CPU

Handles NPM(K) PM(K) WS(K)  VM(M)  CPU(s) Id   ProcessName 
------- ------ ----- -----  -----  ------ ---- --------- 
  244    28   172580 162296   494  123,23 1876 nessusd
  554    59   141412 168808   872   60,98 2716 powershell_ise
  215    34    39200  32724   111   43,44 1396 opsrv
  727     0      104    136     3   25,56    4 System
 1057    42    15856  23904   134    7,56  976 svchost
  324    17     8972  15392    77    3,58 2132 WmiPrvSE
  348     9     4024  10788   191    2,47 3288 postgres

Podemos filtrar la salida de la información. En este ejemplo listaremos solo aquellos que contengan la expresión “tool” en el nombre del proceso, campo “ProcessName

PS C:\> Get-Process | Where-Object {$_.ProcessName -like "*tool*"}

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------   ---- -----------
    324      22     7616      12300    94     1,73   1912 vmtoolsd
    224      20     5588      16448   113     1,98   3216 vmtools

El variable $_ (o $PSITem) representa el objeto actual, los procesos en los ejemplos anteriores.

En el siguiente ejemplo vemos como filtrar y ordenar la salida de Get-Process.

PS C:\> Get-Process | Where-Object ProcessName -like "*tool*" | Sort-Object -Descending VM

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------   ---- -----------
    222      20     5532      16420   111     2,16   3216 vmtoolsd
    324      22     8008      12416    94     1,89   1912 vmtoolsd

Veamos un ejemplo algo más completo, con una consulta de todos aquellos procesos con la expresión “tool” en su nombre, y WorkingSet con consumo de memoria mayor de 14000Kb:

PS C:\> Get-Process | Where-Object {$_.name -Like "*tool*" -and $_.ws -gt  14000kb}

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------   ---- -----------
    222      20     5532      16420   111     2,31   3216 vmtoolsd

Veamos otro ejemplo. Listemos los procesos que están parados:

 

PS C:\> Get-Service | Where-Object { $_.Status -eq "Stopped" }

Status   Name               DisplayName
------   -----------        -----------
Stopped  AeLookupSvc        Application Experience
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
Stopped  Appinfo            Application Information
Stopped  AppMgmt            Application Management

Podemos evitar el uso de { } para consultas simples:

PS C:\> Get-Service | Where-Object Status -eq "Stopped"

Podemos ver algunos operadores de comparación básicos en la presente tabla:

Operador de comparación Significado Ejemplo (devuelve el valor True)
-eq Es igual a 1 -eq 1
-ne Es distinto de 1 -ne 2
-lt Es menor que 1 -lt 2
-le Es menor o igual que 1 -le 2
-gt Es mayor que 2 -gt 1
-ge Es mayor o igual que 2 -ge 1
-like Es como (comparación de caracteres comodín para texto) “Ninguno” -like “N*”
-notlike No es como (comparación de caracteres comodín para texto) “Ninguno” -notlike “P*”
-contains Contiene 1,2,3 -contains 1
-notcontains No contiene 1,2,3 -notcontains 4

Veamos más ejemplos utilizando $_

PS C:\> 1..3 | Foreach-Object { $_ * 2 }
2
4
6
PS C:\windows> Get-ChildItem *.log

Directory: C:\windows

Mode      LastWriteTime    Length   Name 
----    ---------------    ------   ---- 
-a---   25/02/2017 13:26     2988   DtcInstall.log 
-a---   11/08/2017 12:40     5660   PFRO.log 
-a---   06/10/2017 7:15       915   setupact.log 
-a---   06/10/2017 7:15         0   setuperr.log 
-a---   21/11/2014 12:43      5446  vmgcoinstall.log 
-a---   29/10/2017 17:48   1881930  WindowsUpdate.log

PS C:\windows> Get-ChildItem *.log | Foreach-Object { echo $_.BaseName } 
DtcInstall
PFRO
setupact
setuperr
vmgcoinstall
WindowsUpdate

Juguemos un poco con varias cosas a la vez 🙂

PS C:\>$myArray = 1,2,3,4,5 
PS C:\>$sum = 0 
PS C:\>$myArray | Foreach-Object { $sum += $_ } 
PS C:\>$sum 
10

Listemos de forma ordenada el contenido de un directorio:

PS C:\windows> Get-ChildItem *.* | Sort-Object length

Directory: C:\windows

Mode      LastWriteTime  Length   Name 
----      -------------  ------   ---- 
-a---  06/10/2017  7:15       0   setuperr.log 
-a---  22/08/2013 15:25      92   win.ini 
-a---  22/08/2013 15:25     219   system.ini 
-a---  06/10/2017  7:15     915   setupact.log 
-a---  06/10/2017  7:15    1908   diagerr.xml 
-a---  02/09/2011 14:00    2024   prnfiltqv03.dll 
-a---  06/10/2017  7:15    2207   diagwrn.xml

En la Web de Microsoft podemos encontrar más información en la utilización de los cmdlets Where-Object, Sort-object y Foreach-Object.

You may also like

Leave a Comment