Guia basica de Windows PowerShell 2.0

Windows PowerShell es una interfaz de consola que permite la ejecución de comandos y scripts mediante guiones.

Esta interfaz es mucho más completa que la consola de sus predecesores desde MSDOS a Windows 8 ya que está diseñada para realizar labores de administración del sistema y automatización de tareas de administración.
Windows PowerShell no solo puede interactuar con el sistema, sino que también permite interactuar con otros productos de Microsoft como el servidor web IIS, SQL Server o Exchange, e incluso con productos de otras compañías como Vmware.

Windows PowerShell consola

Windows PowerShell no viene incluido por defecto con las versiones de Windows de uso doméstico y profesional comunes, pero si viene instalado de forma predeterminada en Windows Server 2008 R2 y Windows Server 2012.

Para instalar Windows PowerShell en un sistema Windows que no lo tenga instalado el único requisito previo es tener instalado el Net Framework 2.0.
Podemos bajar Windows PowerShell desde el sitio web de Microsoft (Windows Management Framework Core): http://support.microsoft.com/kb/968929

PowerShell utiliza un lenguaje de scripting orientado a objetos y se define normalmente como el lenguaje de administración de Windows.
Independientemente de las herramientas ofrecidas por PowerShell existe una aplicación que ayuda a crear scripts para PowerShell llamada PowerGUI. Esta aplicación ofrece una intuitiva interfaz gráfica capaz de crear scripts en muy pocos clicks autocompletando el código.
La utilidad PowerGUI se puede descargar desde el siguiente enlace: http://powergui.org/

Windows Powershell PowerGUI

Para ejecutar código en PowerShell debemos ajustar la política de ejecución de scripts, para saber cuál es la política de ejecución configurada ponemos lo siguiente en la consola de PowerShell:

PS>get-executionpolicy

Si queremos que el usuario actual pueda ejecutar comandos sin restricciones utilizamos el siguiente comando:

PS>set-executionpolicy unrestricted –scope –currentuser

También debemos comprobar el modo en que se comporta PowerShell cuando se produce un error al ejecutar un script o comando. Con el siguiente comando vemos el modo actual:

PS>$ErrorActionPreference

Los modos son 4: Continue, SilentlyContinue, Inquire y Stop. El modo por defecto es Continue y para cambiarlo a otro modo utilizamos el siguiente comando de ejemplo, de un modo a otro:

PS>$ErroractionPreference = “SilentlyContinue”

 

PowerShell 2 tiene unos comandos (objetos) llamados CMDLET que hacen de todo, también se utiliza el símbolo  |  para pasar datos de un CMDLET a otro. Por ejemplo, para saber la fecha y la hora actual debes utilizar el siguiente comando:

PS>get-date

Si queremos ver todas las opciones del CMDLET get-date utilizaremos la siguiente sintaxis:

PS>get-date | fl

Para meter el resultado de un CMDLET en una variable utilizamos la siguiente sintaxis que meterá el resultado del CMDLET dentro de la variable $date:

PS>$date = get-date

Ahora para visualizar el contenido de la variable simplemente debemos utilizar el nombre de la variable con la siguiente sintaxis:

PS>$date

El CMDLET write-host permite mostrar mensajes por pantalla:

PS>write-host Que buen dia hace hoy

El CMDLET read-host recoge pulsaciones de teclado e introduce lo obtenido en una variable:

PS>$minombre = read-host “Dime tu nombre”
Dime tu nombre: Alvaro

PS>$minombre
Alvaro

Si queremos ver una lista con todos los CMDLETS disponibles para ejecutar en la consola de PowerShell debemos ejecutar el siguiente comando:

PS>get-command

En caso de tener problemas la ayuda de PowerShell también nos puede ayudar, para ello ejecutamos el siguiente comando:

PS>get-help

 

PowerShell 2 ejecuta scripts de la versión 1 y de la versión 2 de PowerShell, por lo que los archivos pueden ser .ps1 o .ps2.
Para ejecutar un script desde la consola CMD convencional debemos indicar su ruta completa absoluta. Ejemplo:

powershell C:datosnombre.ps2

Desde la línea de comandos de PowerShell sería algo así:

PS>C:datosnombre.ps2

 

PowerShell soporta varis tipos de datos, entre ellos se encuentran las variables, tablas, listas y hashes.

Las variables comienzan siempre con el símbolo $ y podemos meter dentro cualquier dato como una fecha, un string, un número, etc…
Se puede asignar el tipo de dato que se va a meter dentro de una variable utilizando corchetes antes de la variable. Por ejemplo:

[int]$numero = 123
[string]$minombre = alvaro

Se pueden realizar operaciones dentro de las variables, por ejemplo sumas:

PS>1 + 2

Incluso utilizar contadores para incrementar en uno una variable:

PS>numero++

También se pueden unir dos o más cadenas de texto (strings) para que salgan juntas:

PS>’Alvaro ’ + ‘Fontela Sanchez’

Con variables también se pueden unir cadenas:

PS>$nombre + $apellidos

 

Una tabla es una variable que contiene varios elementos de cualquier tipo. El primer elemento se encuentra en la posición 0 y los elementos se separan mediante comas:

PS>$tabla = $fecha, $nombre, $apellidos

Se puede acceder a una posición de la tabla indicando la posición entre corchetes. El último elemento de la tabla tiene asignado el [-1]:

PS>$tabla[2]

Se pueden contar los elementos de la tabla con el método .count:

PS>$tabla.count

Se puede modificar un valor de la tabla con la variable, indicando el elemento e igualando al nuevo valor:

PS>$tabla[2] = ‘Alvaro Fontela Sanchez’

 

Una lista es un array en el que se pueden añadir y eliminar elementos fácilmente. Para definir una lista debemos ejecutar la siguiente sintaxis:

PS>$lista = New-Object System-Collections.ArrayList

Ahora con el método .add se pueden añadir elementos de cualquier tipo:

PS>$lista.add(“Alvaro”)
PS>$lista.add(“Fontela”)
PS>$lista.add(“Sanchez”)

Para visualizar el contenido basta con poner el nombre de la lista:

PS>$lista

Para eliminar un elemento de una lista utilizaremos el método .remove:

PS>$lista.remove(“Alvaro”)

 

Un hash es una lista donde cada elemento está compuesto por una clave única y su valor correspondiente (clave – valor). Para crear un hash vacio utilizamos la siguiente sintaxis:

PS>$hash = @{}

Ahora podemos añadir claves y valores con la siguiente sintaxis:

PS>$hash[“nombre”] = “Alvaro”
PS>$hash[“apellidos”] = “Fontela Sanchez”
PS>$hash[“edad”] = 21

Para ver el contenido utilizamos el siguiente comando:

PS>$hash

Para acceder solo a las claves del hash:

PS>$hash.keys

Para acceder solo a los valores

PS>$hash.values

 

PowerShell también soporta expresiones de control de flujo como condiciones y bucles. Estas expresiones son comunes en la mayoría de los lenguajes de programación y scripting.
Las condiciones soportadas son las siguientes:

  • IF: Se encarga de evaluar y comparar. También está permitido el ELSE y ELSEIF.
  • SWITCH: Se utiliza para evaluar muchas condiciones a la vez.
  • WHERE: Se utiliza para evaluar un valor en concreto.

Los bucles soportados por PowerShell son los siguientes:

  • FOREACH: Hace un recorrido directo por los elementos que se le proporcionan.
  • FOR: Crea e inicializa una variable de índice, evaluar la condición con la variable e incrementa la variable si se cumple la condición.
  • WHILE: Es como FOR, pero no tiene en cuenta la creación de la variable ni su incremento.
  • DO-WHILE: Es como el WHILE, pero evalúa al final del bucle.
  • DO-UNTIL: Es como el DO-WHILE pero da vueltas hasta que se produzca la condición.

 

Para definir funciones simples en PowerShell utilizamos la siguiente sintaxis:

PS>function suma($x,$y) {$ resultado = $x + $y; return $resultado}

Ahora si ponemos lo siguiente se debería hacer la suma de la función con los datos que le proporcionemos:

PS>suma 1 2

 

Con PowerShell podemos trabajar con archivos también, por ejemplo, con la siguiente sintaxis comprobamos si existe un archivo, devuelve True si existe, False si no existe:

PS>test-path C:datosdatos.txt

Pero también podemos leer el contenido de archivos de texto, para ello utilizamos el CMDLET get-content y almacenamos lo obtenido en una variable:

PS>$contenido = get-content C:datosdatos.txt

Ahora si escribimos la variable debería salir el contenido almacenado.

Para escribir el contenido de variables dentro de archivos de texto utilizamos la siguiente sintaxis con el CMDLET out-file:

PS>$contenido | out-file C:datosdatosalvaro.txt

Para agregar una línea utilizamos el siguiente comando:

PS>”otra línea más” | out-file C:datosdatosalvaro.txt –append

 

Otra cosa interesante es la posibilidad de buscar cadenas de texto en archivos de texto. Para eso utilizamos el CMDLET select-string:

PS>select-string “Alvaro” C:datosdatos.txt

Tambien podemos buscar en todos los archivos txt que se encuentren dentro de una carpeta con la siguiente sitnaxis:

PS>get-childitem –filter *.txt –recurse | select-string “segunda”

 

El principal objetivo de PowerShell es la administración del sistema operativo Windows centrándose en tres puntos: memoria, sistema de archivos y red.
Estos son algunos CMDLET importantes para la administración de Windows:

  • PS>get-process  == LISTA DE PROCESOS
  • PS>get-process powershell  == INFORMACION SOBRE UN PROCESO ESPECIFICO
  • PS>(get-process notepad).path  == UBICACIÓN DEL EJECUTABLE DE UN PROCESO
  • PS>get-service == LISTADO DE SERVICIOS INICIADOS
  • PS>stop-service spooler == PARAR UN SERVICIO
  • PS>start-service spooler == INICIAR UN SERVICIO

 

  • PS>$pwd  == LA VARIABLE $pwd GUARDA LA UBICACIÓN ACTUAL
  • PS>set-location C:  == PERMITE CAMBIAR LA UBICACIÓN ACTUAL
  • PS>get-childitem –force == OBTENEMOS UN LISTADO DE CARPETAS DE LA UBI ACTUAL
  • PS>get-childitem –force –recurse == VISUALIZAMOS TODA LA ESTRUCTURA.

PowerShell puede navegar y editar el registro de Windows de forma nativa y totalmente natural, permite navegar por el registro como si fueran carpetas. Con el siguiente comando entramos a HKLM:

PS>set-location HKLM:

Para listar el contenido ahora utilizamos lo siguiente:

PS>ls

Aparecerán todas las carpetas contenidas dentro de HKLM, pero con CD podemos entrar y salir de las carpetas del registro como si fueran carpetas de archivos.

Los siguientes CMDLET son útiles para modificar el registro de Windows:

  • PS>new-item prueba == Crea un nuevo elemento
  • PS>remove-item prueba Elimina un elemento
  • PS>new-itemproperty . Autorun 0 == Añade una nueva propiedad
  • PS>(get-itemproperty .). Autorun == Visualiza una propiedad
  • PS>remove-itemproperty . Autorun == Elimina una propiedad