Translate

19 nov 2014

Aprendiendo PowerShell 3.0 [1]

Muy bien, aparte de lenguajes como C o PHP también me he decidido a hacer una serie de guías de iniciación a PowerShell 3.0 (la versión que me ha tocado estudiar, vamos). Y por no decir que me encanta el mundo del scripting a nivel de sistema operativo.

Empezaré haciendo uso del edito PowerShell ISE, que debería venir tanto en Windows 8/8.1 como en servidores a partir del 2008, y creo que también en Windows 7. Es un editor muy amigable que permite escribir código y probarlo al mismo tiempo, rompiendo con el concepto de "consola" o "terminal" propio de sistemas MSDOS o Linux.

Para quién no haya trabajado nunca con PowerShell, puede simplemente buscar en su sistema el editor y comprobar su versión de la siguiente forma:


El comando Get-Host nos saca en pantalla un conjunto de valores y características del PowerShell instalado en nuestro equipo. Y aquí es donde empezamos ya a explicar la dinámica que tiene el scripting en este lenguaje. Todo lo que muestran los comandos en pantalla se denomina "objetos", y cada objeto tiene sus propiedades y sus características. En nuestro caso, como Get-Host nos devuelve un objeto con las características de nuestro PowerShell instalado, le hemos dicho que mediante una "tubería" o las famosas pipes seleccionado solamente la característica o atributo "version".

Y bueno, ¿qué es eso de tuberías y pipes? Es un concepto muy utilizado en el scripting de sistemas operativos, sobre todo en Linux. Su finalidad es, básicamente, coger la salida del comando (lo que debería sacar por pantalla), en este caso Get-Host, y pasa su contenido a otro comando para que trabaje sobre esta información, de forma que podamos seleccionar solamente el atributo de la versión.

Hay otras formas de hacer tuberías donde yo creo que se entiende mucho mejor, como utilizando el comando "tee-object" que nos coge la salida del comando inicial y la redirige tanto a la pantalla como a otro comando.

Si la versión de PowerShell no es la correcta, aquí dejo una guía sobre cómo instalar la versión 3.0, que yo no he probado porque yo ya tengo dicha versión por defecto y no me ha hecho falta:

Y ahora, que está la introducción hecha, pasamos ya al scripting, que es la mejor forma de aprender. Aconsejo que no se copie y pegue solamente el código, sino que lo tecleéis todo a mano y probéis a cambiarlo y a hacer pruebas, que es la mejor forma de comprender cómo funciona el lenguaje. Durante esta serie de guías, iré haciendo ejercicios de forma que vaya aumentando la complejidad del código. Así que paciencia.

Recordar también que, en el ISE, si presionamos Ctrl+R se nos expandirá automáticamente la terminal azul hasta arriba, y si volvemos a presionar estas teclas se ajustará al tamaño anterior para permitirnos editar el código. Esto es bastante práctico a la hora de picar teclado.

¡Vamos con la primera!


1) Sumar dos números pasados por parámetro:
Bueno, la idea inicial es sencilla: pasarle dos parámetros al script y que sume sus valores. Los parámetros son variables o datos que se van pasando de un lado a otro, por ejemplo, desde un script inicial invocamos otro script pasando el valor de variables, estas variables en este script invocado se denominan parámetros. Las funciones de todo lenguaje de programación (trozos de código que hacen siempre lo mismo) también pueden recibir parámetros, y eso es lo que usaremos para filtrar los parámetros que le pasemos al archivo.

Tenemos que tener en cuenta, además, que los parámetros deben ser numéricos, porque si son letras dará error, y no estaríamos sumando, sino concatenando. También tenemos que comprobar que no haya ningún parámetro, sino estaría sumando valores vacíos.



Como costumbre, yo siempre haré programas betas donde voy comprobando paso a paso que lo que busco se va cumpliendo, no es plan de ir directamente a hacerlo todo, sino tener claras las cosas e ir poquito a poquito.

Lo primero que hago es declarar una función que me filtre la cantidad de parámetros, asegurándome de que obtengo la cantidad pasada, y los dos primeros. Vemos en la primera línea de la terminal azul cómo invocar el script y cómo pasarle los parámetros (le estamos pasando tres: número 1, número 2 y número 3). En la segunda línea invocamos el script sin parámetros, y obtenemos un error.

¿Por qué sucede esto? Bueno, he definido una función que reciba tres parámetros con el nombre que yo quiera; una regla importante a la hora de programar es que los identificadores sean claros, entendiendo por identificador el nombre de una función o variable. Aquí es muy intuitivo: $cantidad, $numero1 y $numero 2. No sería igual si fuesen: $a, $b y $c, pues resultaría caótico acordarse de qué hace cada variable (esto solamente lo hago en pruebas donde tengo pocas variables, en realidad, para ahorrar tiempo al utilizarlas).

Luego dentro de la función "sumarParametros" compruebo mediante el if ("sí" condicional) si la cantidad de parámetros no es igual a cero, si la sentencia if nos devuelve un booleano con valor true, será que , efectivamente, hemos pasado parámetros porque no es cero, pero si es false, es que es es igual que cero, y dependiendo de si devuelve una cosa u otra, saltará al else ("por el contrario", en caso de que la condición anterior no se cumpla) o ejecutará directamente lo que hay ahí.

Tenemos que darnos cuenta de que en la comprobación usamos el comparador "-ne", esto significa "not equal" (no es igual). Y en el Write-Output (alias de echo), hacemos uso del retorno de carro ("`n"), que nos hará un salto de línea.

A la hora de invocar la función utilizamos la variable de entorno $args, que contiene información relativa a los parámetros/argumentos del script. Le pasamos primero la cantidad, que será el valor de $cantidad, y luego los dos primeros parámetros. Como la variable va a contener un array (conjunto de valores, uno detrás de otro, dentro de la variable), accedemos al primer argumento usando $args[0], y al segundo mediante $args[1]. De esta forma, filtramos los parámetros que queremos utilizar.

Hasta aquí todo chachi, controlamos la cantidad y tenemos los valores de los parámetros, pero claro, necesitamos comprobar ahora que los parámetros sean números y no cualquier cosa extraña, porque tal y como está, la suma nos dará error. Si lanzamos apurados el script y se nos escapa una letra, tenemos que asegurarnos de que eso no va a petar el sistema por todos lados.

Así que, dentro de la condición, hacemos ligeros cambios para controlar el tipo de dato que nos pasan:


Una vez nos han pasado dos parámetros, comprobamos mediante un if más complejo si ambos son números, en ese caso vemos que nos dice que está todo correcto. En caso contrario, vemos que el segundo parámetro es el que da error, por lo que salta al else de esa condición.

Ya tenemos, por tanto, controlada tanto la cantidad de parámetros como sus tipos. Lo que queda es definir una variable que sume ambos números y sacarla por pantalla:



Y tenemos, finalmente, nuestra suma =)


2) Multiplicar dos números pasados por parámetro:
En este caso solo tenemos que modificar el script anterior para que multiplique, en lugar de sumar.



No hay comentarios: