Compartir a través de


5. Variables

Una variable representa una ubicación de almacenamiento para un valor y ese valor tiene un tipo. Los lenguajes de programación de procedimientos tradicionales son de tipos estáticos; Es decir, el tipo en tiempo de ejecución de una variable es con el que se declaró en tiempo de compilación. Los lenguajes orientados a objetos agregan la idea de herencia, que permite que el tipo en tiempo de ejecución de una variable sea con el que se declaró en tiempo de compilación o con algún tipo derivado de ese tipo. Al ser un lenguaje con tipos dinámicos, las variables de PowerShell no tienen tipos por sí solos. De hecho, las variables no están definidas; simplemente se convierten cuando se les asigna un valor por primera vez. Y aunque una variable puede estar restringida (sección 5.3) para que contenga un valor de un tipo determinado, la información de tipo de una asignación no siempre se puede comprobar estáticamente.

En momentos diferentes, una variable puede asociarse a valores de tipos diferentes mediante la asignación (sección 7.11) o el uso de los operadores ++y ‑‑ (sección 7.1.5, sección 7.2.6). Cuando se cambia el valor asociado a una variable, el tipo de ese valor puede cambiar. Por ejemplo,

$i = "abc"        # $i holds a value of type string
$i = 2147483647   # $i holds a value of type int
++$i              # $i now holds a value of type double because
                  # 2147483648 is too big to fit in type int

Cualquier uso de una variable que no se haya creado da como resultado el valor $null. Para ver si se ha definido una variable, use el cmdlet Test-Path.

5.1 Ubicación grabable

Una ubicación grabable es una expresión que designa un recurso al que un comando tiene acceso de lectura y escritura. Una ubicación grabable puede ser una variable (sección 5), un elemento de matriz (sección 9), un valor asociado en una tabla hash a la que se accede mediante un subíndice (sección 10), una propiedad (sección 7.1.2) o un almacenamiento que administra un proveedor (sección 3.1).

5.2 Categorías de variable

PowerShell define las siguientes categorías de variables: variables estáticas, variables de instancia, elementos de matriz, pares clave-valor de tabla hash, parámetros, variables normales y variables en unidades de proveedor. Las subsecciones siguientes describen cada una de estas categorías.

En el ejemplo siguiente:

function F ($p1, $p2) {
    $radius = 2.45
    $circumference = 2 * ([Math]::PI) * $radius

    $date = Get-Date -Date "2010-2-1 10:12:14 pm"
    $month = $date.Month

    $values = 10, 55, 93, 102
    $value = $values[2]

    $h1 = @{ FirstName = "James"; LastName = "Anderson" }
    $h1.FirstName = "Smith"

    $Alias:A = "Help"
    $Env:MyPath = "e:\Temp"
    ${E:output.txt} = 123
    $function:F = { "Hello there" }
    $Variable:v = 10
}
  • [Math::PI] es una variable estática.
  • $date.Month es una variable de instancia.
  • $values[2] es un elemento de matriz.
  • $h1.FirstName es una clave Hashtable cuyo valor correspondiente es $h1['FirstName']`.
  • $p1 y $p2 son parámetros
  • $radius, $circumference, $date, $month, $values, $value y $h1son variables normales.
  • $Alias:A, $Env:MyPath, ${E:output.txt} y $function:F son variables en las unidades de proveedor correspondientes.
  • $Variable:v es una variable normal escrita con su unidad de proveedor completa.

5.2.1 Variables estáticas

Un miembro de datos de un objeto que pertenece al tipo del objeto en lugar de a esa instancia concreta del tipo se denomina variable estática. Vea las secciones 4.2.3, 4.2.4.1 y 4.3.8 para ver algunos ejemplos.

PowerShell no proporciona ninguna manera de crear tipos que contengan variables estáticas, pero el entorno de host puede proporcionar objetos de estos tipos.

El entorno de host y el sistema de recolección de elementos no utilizados administran la memoria para crear y eliminar objetos que contienen variables estáticas.

Para obtener información sobre el acceso a una variable estática, vea la sección 7.1.2.

Un miembro de datos estático puede ser un campo o una propiedad.

5.2.2 Variables de instancia

Un miembro de datos de un objeto que pertenece a una instancia concreta del tipo del objeto en lugar de a ese mismo tipo se denomina variable de instancia. Vea las secciones 4.3.1, 4.3.2 y 4.3.3 para ver algunos ejemplos.

Un entorno de host de PowerShell podría proporcionar una manera de crear tipos que contengan variables de instancia o de agregar nuevas variables de instancia a los tipos existentes.

El entorno de host y el sistema de recolección de elementos no utilizados administran la memoria para crear y eliminar objetos que contienen variables estáticas.

Para obtener información sobre el acceso a una variable de instancia, vea la sección 7.1.2.

Un miembro de datos de instancia puede ser un campo o una propiedad.

5.2.3 Elementos de matriz

Una matriz se puede crear mediante un operador de coma unario (sección 7.2.1), una subexpresión (sección 7.1.6), una expresión de matriz (sección 7.1.7), un operador de coma binario (sección 7.3), un operador de rango (sección 7.4) o un cmdlet New-Object.

El entorno de host y el sistema de recolección de elementos no utilizados administran la memoria para crear y eliminar matrices.

Las matrices y los elementos de matriz se describen en la sección 9.

5.2.4 Pares clave-valor de tablas hash

Una tabla hash se crea mediante un literal hash (sección 2.3.5.6) o el cmdlet New-Object. Se puede agregar un nuevo par clave-valor mediante el operador [] (sección 7.1.4.3).

El entorno de host y el sistema de recolección de elementos no utilizados administran la memoria para crear y eliminar tablas hash.

Las tablas hash se describen en la sección 10.

5.2.5 Parámetros

Un parámetro se crea cuando se invoca su comando primario y se inicializa con el valor del argumento proporcionado en la invocación o por el entorno de host. Un parámetro deja de existir cuando finaliza su comando primario.

Los parámetros se describen en la sección 8.10.

5.2.6 Variables normales

Una variable normal se define mediante una expresión de asignación (sección 7.11) o una instrucción foreach (sección 8.4.4). Algunas variables normales las predefine el entorno de host, mientras que otras son transitorias; van y vienen según sea necesario en tiempo de ejecución.

La duración de una variable normal es esa parte de la ejecución del programa durante la cual se garantiza que el almacenamiento se reservará para ella. Esta duración comienza en la entrada en el ámbito al que está asociado y finaliza no antes del final de la ejecución de ese ámbito. Si el ámbito primario se introduce de forma recursiva o iterativa, se crea una instancia de la variable local cada vez.

El almacenamiento al que hace referencia una variable normal se reclama independientemente de la duración de esa variable.

Una variable normal se puede denominar explícitamente con un prefijo de espacio de nombres Variable: (sección 5.2.7).

5.2.7 Variables en unidades de proveedor

El concepto de proveedores y unidades se introduce en la sección 3.1, y cada proveedor puede proporcionar sus propias unidades de espacio de nombres. Esto permite tener acceso a los recursos de esas unidades como si fueran variables normales (sección 5.2.6). De hecho, una variable normal se almacena en la unidad del proveedor del sistema de archivos Variable: (sección 3.1.5) y se puede acceder a ella por su nombre normal o su nombre de espacio de nombres completo.

Algunos tipos de variables de espacio de nombres están restringidos implícitamente (sección 5.3).

5.3 Variables restringidas

De manera predeterminada, una variable puede designar un valor de cualquier tipo. Pero una variable puede estar restringida a designar valores de un tipo determinado especificando ese tipo como literal de tipo antes de su nombre en una asignación o un parámetro. Por ejemplo,

[int]$i = 10   # constrains $i to designating ints only
$i = "Hello"   # error, no conversion to int
$i = "0x10"    # ok, conversion to int
$i = $true     # ok, conversion to int

function F ([int]$p1, [switch]$p2, [regex]$p3) { ... }

Cualquier variable que pertenezca al espacio de nombres Env: , Alias: o al espacio de nombres del sistema de archivos (secciones 2.3.2 y 3.1) se restringe implícitamente al tipo string. Cualquier variable que pertenezca al espacio de nombres Function: (secciones 2.3.2 y 3.1) se restringe implícitamente al tipo scriptblock.