PowerShell (II de V)

Comenzamos esta segunda entrega describiendo la base de la sintaxis en powershell. Lo primero que debemos conocer es que los comandos de PowerShell ahora se denominan cmdlets y comparten una sintaxis común.


 


Todos los cmdlets consisten de un verbo y un nombre, separados por un guión.


Esta estructura permite un aprendizaje más rápido y sobre todo relacionar fácilmente el verbo con lo que se quiere realizar, por ejemplo.


 


Algunos de los verbos admitidos en esta versión 1.0 de powershell son get, set, new, write, start, stop, remove, add, etc..Es relativamente sencillo suponer qué es lo que hace cada uno de los verbos. Si a continuación le agregamos el nombre, completamos el cmdlet, por ejemplo:


 



  • Get-help

  • Get-childitem

  • Get-service

  • Get-process

  • New-item

  • Set-acl

  • Set-alias

  • Set-date

 


Sin embargo muchos de estos cmdlets tienen su alias en versión UNIX y CMD.EXE para aquellos administradores que vengan desde estos entornos, por ejemplo:


 


Get-childitem nos sirve para listar los objetos dentro de una carpeta o disco y podemos utilizar el cmdlet nativo de Powershell o los ya conocidos ls y dir de UNIX y CMD.EXE respectivamente. Además, para no tener que escribir todo el cmdlet, también existe un alias reducido como gci en este caso.


 




Si no conocemos el nombre que debemos utilizar después de un verbo, PowerShell incluye una ayuda para autocompletar los cmdlets utilizando la tecla tabulación. Por ejemplo, si escribimos el verbo set- y queremos saber qué nombres están admitidos, solo vamos circulando por los nombres con TAB.


 



  • Set-acl -> TAB -> set-alias -> TAB -> set-authenticodeSignature -> TAB -> set-content -> TAB -> set-date -> TAB -> set-ExecutionPolicy ->  y así sucesivamente

 


Podemos también comenzar escribiendo las primeras letras del nombre y PowerShell completará los nombres que coincidan con estas primeras letras.


 


Windows PowerShell es una consola orientada a objetos, lo que quiere decir que todos los comandos de entrada y salida son en sí mismos objetos.  PowerShell se basa en el modelo de objetos de.Net.


 


.Net es una representación de objetos unificada que utilizan todos los equipos de desarrollo de Microsoft, por lo tanto desde PowerShell se pueden gestionar todos los componentes de Windows y de las aplicaciones basadas en .Net


 


Por ejemplo, si queremos conocer el día de la semana del 4 de enero de 1643 (nacimiento de Isaac Newton), solo tenemos que escribir lo siguiente:


 



  • (get-date “04/01/1643”).DayOfWeek

 


En este ejemplo, el cmdlet get-date devuelve el objeto .Net DateTime, que tiene una propiedad que calcula el día de la semana. Una aplicación más interesante para los administradores de sistemas es por ejemplo verificar si un archivo es más reciente que otro.


 



  • (get-childitem archivo1.txt).lastwritetime –gt (get-childitem archivo2.txt).lastwritetime

 


Si queremos conocer todos los detalles de cada cmdlet, Get-help nos muestra la ayuda completa. Su so es: get-help cmdlet, por ejemplo: get-help get-childitem.


 


La ayuda en PowerShell está muy cuidada y es muy extensa, de hecho podemos mostrar tres niveles de ayuda:


 



  • get-help get-childitem (Ayuda general y resumida)

  • get-help get-childitem –detailed (ayuda detallada)

  • get-help get-childitem –full (ayuda técnica completa)

 


Si la ayuda es extensa para visualizarla en pantalla, podemos exportar el contenido a un archivo de texto:


 



  • get-help get-childitem –full | out-file C:AyudaPowerShell.txt

 


Aunque si estáis acostumbrados a cmd.exe, podemos escribir lo siguiente para hacer lo mismo:


 



  • get-help dir –full > C:AyudaPowerShell.txt

 


 


Además, parte de la ayuda completa incluye numerosos ejemplos de aplicación de cada cmdlet.


 


Como habéis podido observar, en el anterior ejemplo hemos utilizado el símbolo | Una de las características más importantes de PowerShell es la capacidad de crear pipas (pipes), de tal forma que podemos pasar los resultados de un cmdlet hacia el siguiente. Esta funcionalidad ya la conocen muy bien los administradores que vienen del entorno UNIX ya que es una característica común desde hace mucho tiempo, y que sin embargo en Windows había sido una funcionalidad reducida a algunos comandos muy específicos, como por ejemplo > para exportar los resultados a un archivo de texto.


 


Cada cmdlet en un pipeline recibe un objeto del cmdlet previo, realiza una operación en él y después pasa el resultado al siguiente cmdlet en la pipa.


 



  • Get-childitem –recurse –filter *.exe | format-table name, lenght

 


En el ejemplo anterior, el cmdlet get-childitem recorre todas las carpetas por debajo de la ubicación actual en busca de archivos .exe y el resultado se pasa al cmdlet format-table para dar formato con el nombre y la longitud de los archivos encontrados.


 


Esta es una forma sencilla de hacer búsquedas y formatear la salida en pantalla. Otro ejemplo similar es el siguiente:


 



  • Get-childitem –recurse –path “C:windows” –filter *.dll | where {$_-name –match “system.*dll”}

 


Esta instrucción busca todos los archivos en la carpeta Windows que lleven la palabra system y con extensión dll.


 


Una característica destacable es la capacidad de ejecución en streaming de Powershell, es decir, no necesitamos esperar a que se procesen todos los resultados para verlos en pantalla, sino que a medida que se van encontrando valores coincidentes, se van presentando en pantalla.


 


En la mayoría de las consolas, el streaming se consigue ejecutando procesos separados para cada elemento en la pipa. PowerShell solo utiliza un proceso de ejecución y un único hilo. El streaming se logra particionando los cmdlets en tres cláusulas: inicio de proceso (begin-processing), objeto en proceso (process-object) y fin de proceso (end-processing).


 


Con esto llegamos al final de esta segunda entrega de PowerShell, seguiremos comentando más detalles de los cmdlets y su utilización por parte de los administradores de sistemas en el siguiente post.

5 comentarios sobre “PowerShell (II de V)”

  1. Muy buenos artículos para introducirse a esta tecnología de Microsoft.
    Estoy en espera de los restantes artículos de este tema.
    Saludos desde México.

Deja un comentario

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