Capítulo 3: Variables en PowerShell

Publicado por P. Ruiz en

Cómo establecer el tipo de dato de una variable

En PowerShell existen dos formas de establecer la naturaleza del dato que va a almacenar una variable:

  • Implícita: El tipo de dato que puede almacenar la variable se establece en función del valor asignado .

  • Explícita: El programador establece el tipo de dato que podrá contener la variable. De este modo, cuando asignemos un valor que no coincide con el tipo especificado, PowerShell tratara de amoldarlo a la variable.

Definición implícita:

Como hemos dicho más arriba, el tipo de dato de estas variable se establece en el momento de asignarle valor. De hecho, ya vimos al principio una definición de esta clase:

PowerShell-UD03-016

En este caso, la variable $hola se crea en el momento de usarla y se le asigna un valor de tipo texto (al que llamaremos string o cadena de caracteres).

Este método también se utiliza para crear datos de otros tipos. Por ejemplo, en el siguiente ejemplo creamos una variable numérica (en particular, de tipo double):

PowerShell-UD03-017

Una variable, cuya definición de tipo se ha realizado de forma implícita, podrá ir cambiando el tipo de dato almacenado según nuestras necesidades. Por ejemplo, después de la línea anterior podríamos escribir lo siguiente si experimentar ningún tipo de error:

PowerShell-UD03-018

… Y si lo comprobamos, obtendremos una salida como esta:

PowerShell-UD03-019

Definición explícita:

En este caso, informamos a PowerShell del tipo de dato que puede almacenar una variable particular. Al hacerlo, estamos estableciendo un límite en cuanto a la naturaleza de los datos que pueden almacenarse dentro de la variable.

Por ejemplo, como hemos dicho antes, la variable $precio del ejemplo anterior será de tipo double, por lo que ocupará en memoria 64 bits. Si nos parece excesivo este gasto de memoria por la naturaleza de los datos que estamos almacenando, al definir la variable, podemos especificar el tipo de dato al que pertenece. Lo haremos de este modo:

PowerShell-UD03-020

Cuando el dato asignado no coincida con el tipo esperado, pueden ocurrir dos cosas:

  • Que las características del dato se modifiquen para amoldarse a la variable.

  • Cuando lo anterior no es posible, se producirá un error. Observa la imagen siguiente si tratamos de repetir ahora el ejemplo anterior:

Observa que, como no puede realizarse la conversión, después del error se muestra el mismo valor del principio.

PowerShell-UD03-021

Especificar el tipo de un dato

Otra alternativa que tenemos a nuestra disposición consiste en indicar el tipo al que pertenece el propio dato. De este modo, podríamos lograr las ventajas de las dos opciones anteriores: tener una variable que pueda cambiar su tipo y usar el espacio de memoria adecuado para el dato que estamos guardando. Para hacerlo, bastaría con escribir lo siguiente:

PowerShell-UD03-022

Una ventaja añadida es que podemos controlar, de forma estricta, el tipo de valor almacenado. Para entenderlo, observemos el siguiente ejemplo:

PowerShell-UD03-023

Aunque para nosotros el dato anterior es claramente una fecha, para PowerShell no es más que un texto.

De hecho, si mostramos el contenido de variable, obtenemos exactamente lo que asignamos:

PowerShell-UD03-024

Sin embargo, cuando especificamos el tipo de dato, éste será asumido por la variable y PowerShell entenderá que se trata de una fecha:

PowerShell-UD03-025

La diferencia se aprecia claramente cuando consultamos en contenido de la variable:

Ahora comprobamos que la fecha se muestra en formato anglosajón y que se ha asignado una hora predeterminada.

PowerShell-UD03-026

Cuando amoldamos un dato a un tipo diferente, puede ocurrir que la coincidencia no sea exacta. En este caso, PowerShell tratará de buscar la solución más adecuada. Por ejemplo, cuando escribimos lo siguiente:

PowerShell-UD03-027

Obtendríamos un resultado como este:

PowerShell-UD03-028

Como puedes comprobar, PowerShell nos ofrece el entero más próximo al valor dado.

Cuando esto no sea posible, sencillamente se producirá un error de ejecución. Por ejemplo, imagina el siguiente caso:

PowerShell-UD03-029

El resultado sería este:

PowerShell-UD03-030

Actividades resueltas: Trata de resolver las siguientes cuestiones, antes de consultar el resultado:

    1. En un apartado anterior, hemos hablado de cómo utilizar el cmdlet New-Variable, para realizar una definición explícita de una variable. Ahora, ya sabemos cómo expresar el tipo de dato de cualquier valor.

      El asunto que te planteo en esta actividad es el siguiente: ¿Sabrías combinar ambas ideas para definir una nueva variable con el cmdlet New-Variable y asignarle un valor de un tipo concreto?.

      Te propongo que, para comprobarlo, uses el cmdlet New-Variable para crear una variable, llamada $Edad, que contenga el valor 18, pero especificando que es de tipo entero.

      En realidad, basta con amoldar el tipo de dato, como hemos visto más arriba:

      PowerShell-UD03-031

    2. Siguiendo la idea anterior, y sabiendo que la expresión $env:USERNAME devuelve el nombre de la cuenta de usuario, ¿serías capaz de crear una nueva variable para almacenar dicho nombre, usando el cmdlet New-Variable, e indicando de forma explicita que el valor que estamos almacenando es de tipo texto?

      En este caso, debemos hacer dos observaciones:

      1. En realidad, el contenido de la variable de entorno ($env:USERNAME) ya es del tipo que necesitamos, pero la actividad nos pide que lo indiquemos de forma explícita.

      2. Como $env:USERNAME es una variable, para que el forzado de tipo se aplique antes que la asignación del valor, necesitamos poner la expresión entre paréntesis.

      En definitiva, quedaría así:

      PowerShell-UD01-032

    3. Con lo que hemos aprendido en este apartado, ¿cómo podríamos crear un script que reciba un número decimal y nos muestre su valor redondeado al entero más próximo?