Compartir a través de


5. Variables

Nota editorial

Importante

La especificación del lenguaje de Windows PowerShell 3.0 se publicó en diciembre de 2012 y se basa en Windows PowerShell 3.0. Esta especificación no refleja el estado actual de PowerShell. No hay ningún plan para actualizar esta documentación para reflejar el estado actual. Esta documentación se presenta aquí para obtener referencia histórica.

El documento de especificación está disponible como un documento de Microsoft Word del Centro de descarga de Microsoft en: https://www.microsoft.com/download/details.aspx?id=36389 Ese documento de Word se ha convertido para su presentación aquí en Microsoft Learn. Durante la conversión, se han realizado algunos cambios editoriales para dar cabida al formato de la plataforma Docs. Se han corregido algunos errores tipográficos y menores.

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 se escriben estáticamente; es decir, el tipo en tiempo de ejecución de una variable es que con el que se declaró en tiempo de compilación. Los lenguajes orientados a objetos agregan la idea de herencia, lo que permite que el tipo de tiempo de ejecución de una variable sea el con el que se declaró en tiempo de compilación o algún tipo derivado de ese tipo. Siendo un lenguaje de tipo dinámico, las variables de PowerShell no tienen tipos, por se. De hecho, las variables no están definidas; simplemente entran en ser cuando se les asigna por primera vez un valor. Y aunque una variable se puede restringir (§5.3) a mantener 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 estar asociada a valores de distintos tipos a través de la asignación (§7.11) o el uso de los ++ operadores y ‑‑ (§7.1.5, §7.2.6). Cuando se cambia el valor asociado a una variable, el tipo del 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 (§5), un elemento de matriz (§9), un valor asociado en una tabla hash a la que se accede a través de un subíndice (§10), una propiedad (§7.1.2) o un almacenamiento administrado por un proveedor (§3.1).

5.2 Categorías de variables

PowerShell define las siguientes categorías de variables: variables estáticas, variables de instancia, elementos de matriz, pares clave-valor hashtable, 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 Hashtable clave cuyo valor correspondiente es $h 1['FirstName']'
  • $p1 y $p2 son parámetros
  • $radius, $circumference, $date, $month, $values, $valuey $h1 son variables normales
  • $Alias:A, $Env:MyPath, ${E:output.txt}y $Function:F son variables en las unidades de proveedor correspondientes.
  • $Variable:v es realmente 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. Consulte §4.2.3, §4.2.4.1 y §4.3.8 para ver algunos ejemplos.

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

La memoria para crear y eliminar objetos que contienen variables estáticas se administra mediante el entorno host y el sistema de recolección de elementos no utilizados.

Consulte §7.1.2 para obtener información sobre el acceso a una variable estática.

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 determinada del tipo del objeto en lugar del propio tipo se denomina variable de instancia. Consulte §4.3.1, §4.3.2 y §4.3.3 para ver algunos ejemplos.

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

La memoria para crear y eliminar objetos que contienen variables estáticas se administra mediante el entorno host y el sistema de recolección de elementos no utilizados.

Consulte §7.1.2 para obtener información sobre el acceso a una variable de instancia.

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

5.2.3 Elementos de matriz

Se puede crear una matriz a través de un operador unario coma (§7.2.1), subexpresión (§7.1.6), array-expression (§7.1.7), operador de coma binario (§7.3), operador de intervalo (§7.4) o cmdlet New-Object .

El entorno 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 §9.

5.2.4 Pares clave-valor hashtable

Se crea una tabla hash a través de un literal hash (§2.3.5.6) o el cmdlet New-Object . Se puede agregar un nuevo par clave-valor mediante el [] operador (§7.1.4.3).

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

Las tablas hash se describen en §10.

5.2.5 Parámetros

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

Los parámetros se describen en §8.10.

5.2.6 Variables ordinarias

Una variable normal se define mediante una expresión de asignación (§7.11) o una instrucción foreach (§8.4.4). Algunas variables normales están predefinidas por el entorno de host, mientras que otras son transitorias, vienen y van 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 está reservado para ella. Esta duración comienza en la entrada en el ámbito con el que está asociado y termina antes que el final de la ejecución de ese ámbito. Si el ámbito primario se escribe de forma recursiva o iterativa, se crea una nueva 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 variable: prefijo de espacio de nombres (§5.2.7).

5.2.7 Variables en unidades de proveedor

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

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

5.3 Variables restringidas

De forma predeterminada, una variable puede designar un valor de cualquier tipo. Sin embargo, una variable se puede restringir para designar valores de un tipo determinado especificando ese tipo como un 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 (§2.3.2, §3.1) se restringe implícitamente al tipo string. Cualquier variable que pertenezca al espacio de nombres Function: (§2.3.2, §3.1) se restringe implícitamente al tipo scriptblock.