Búsqueda de sitios web

Cómo utilizar variables de PowerShell


Las variables en PowerShell se utilizan para almacenar valores, datos u otra información que necesitará más adelante en su secuencia de comandos. También se pueden utilizar para capturar los resultados de un cmdlet. Pero, ¿cómo se crean variables y se usan fuera de una función, por ejemplo?

En PowerShell, tenemos diferentes ámbitos a los que pueden pertenecer las variables. Los ámbitos protegen las variables para que no se modifiquen, pero también pueden impedirle acceder a una variable que haya creado en una función.

En este artículo, veremos cómo asignar y usar variables y usarlas en diferentes ámbitos.

Variables de PowerShell

Comencemos con los conceptos básicos de las variables de PowerShell antes de ver todos los entresijos. Para crear una variable en PowerShell, usaremos el signo de dólar $. El nombre de la variable no distingue entre mayúsculas y minúsculas y comúnmente se escribe en camelCase (escriba en mayúscula la primera letra de cada palabra excepto la primera).

$newVariable = "LazyAdmin"

Los nombres de las variables pueden incluir espacios y caracteres especiales, pero deberías evitarlo. Los espacios y caracteres especiales harán que el código sea más difícil de leer y provocarán muchos errores de escritura en el script.

También es bueno saber que no es necesario especificar el tipo de variable. Las variables de PowerShell tienen tipos flexibles, lo que significa que una variable de cadena puede convertirse en un número entero, una matriz o una tabla hash, por ejemplo.

$newVariable = "LazyAdmin"                  # String - System.String
$newVariable = 123                          # Integer - System.Int32 
$newVariable = "Apple", "Grapes", "Kiwi"    # Array - Array of System.String

Lo que también necesitas saber es que existen tres tipos de variables en PowerShell. No estamos hablando aquí de si una variable es una cadena o un número entero, sino de dónde se origina la variable.

  • Variables creadas por el usuario: estas son las variables que se ven en los ejemplos anteriores, variables que usted crea y mantiene. Las variables creadas por el usuario solo existen en la sesión actual de PowerShell. Tan pronto como cierra la ventana de PowerShell, la variable y su valor desaparecen.

    Sin embargo, hay una excepción: las variables creadas en su perfil de PowerShell se guardan y se pueden usar en diferentes sesiones de PowerShell.
  • Variables automáticas: PowerShell crea y mantiene las variables automáticas y almacena información de estado. Por ejemplo, $error, $home o $profile son algunas de las variables automáticas de PowerShell. Puedes encontrar la lista completa aquí.
  • Variables de preferencia: estas variables también las crea PowerShell, pero la diferencia es que puede cambiarlas para personalizar el comportamiento de PowerShell. Un buen ejemplo es la variable $ErrorActionPreference que le permite establecer qué debe hacer PowerShell cuando se produce un error. Puede encontrar todas las variables de preferencia aquí.

Crear y establecer variables

Como ya se explicó brevemente al principio, crear una variable es bastante sencillo. Para una variable simple y de tipo flexible, solo necesita especificar el nombre de la variable.

$newVariable = $null

También es posible crear una variable en PowerShell sin especificar ningún valor, ni siquiera $null. Para esto, tendrá que usar el cmdlet Set-Variable, que crea la variable con el valor $null por usted.

Set-Variable -Name $null

El cmdlet set-variable tiene algunas ventajas al crear una variable; por ejemplo, puede darle una descripción a su variable o hacer que se lea en línea. Pero en general no se usa mucho.

Al crear variables no es necesario especificar si es una cadena o un número entero en PowerShell, lo cual es realmente conveniente. Pero al crear una función que espera un número entero, es una buena idea especificar explícitamente que la variable es un número entero.

Para especificar el tipo al crear una variable, deberá utilizar la notación de conversión. Para ello, coloque el nombre del tipo entre paréntesis antes de la variable:

[string]$stringVariable = "Hello"       # Can only contain a string
[int]$numberVariable = 15               # Can only contain a integer
[datetime]$dateVar = "01/15/24"         # Accepts only datatime objects

Como puede ver en el último ejemplo (la variable de fecha y hora), no tenemos que configurar un objeto de fecha y hora. PowerShell aceptará el valor, siempre que pueda convertirlo al tipo correcto.

Tomemos como ejemplo la variable entera, no aceptará una cadena con una palabra pero sí un número en una cadena porque puede convertirlo en un número entero.

[int]$numberVariable = 15
$numberVariable = "LazyAdmin"

# Error result
Cannot convert value "LazyAdmin" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:1

# This does work however:
$numberVariable = "55"

Tipo de variable de PowerShell

Si desea saber cuál es el tipo de una variable en PowerShell, deberá utilizar el método GetType(). Esto devolverá el tipo base, el nombre del tipo y mucha otra información sobre la variable. Para ver solo el nombre del tipo, seleccione la propiedad del nombre:

$numberVariable.GetType().name

# Result
Int32

Borrar variable de PowerShell

Para borrar una variable en PowerShell tiene dos opciones: puede usar el cmdlet Clear-Variable o simplemente sobrescribir la variable con un valor $null. El cmdlet hace exactamente lo mismo, por lo que el método más conveniente es asignar el valor $null de esta manera.

$newVariable = $null

# Alternative
Clear-Variable -Name newVariable

Eliminación de variables

Otra opción es eliminar variables en PowerShell. Esto eliminará completamente la variable y su valor de su sesión de PowerShell. Para hacer esto, necesitará utilizar el cmdlet Remove-Variable.

Cuando desee eliminar o borrar una variable en PowerShell por razones de seguridad, debe tener algo en cuenta. PowerShell se basa en .Net y .Net utiliza un recolector de basura para limpiar los elementos de memoria que ya no son necesarios.

Pero hasta que pase el recolector de basura, el valor de su variable seguirá estando disponible en la memoria de su computadora. El cmdlet Clear-Variable en realidad hace una copia de la variable y marca la anterior para su recopilación. Mientras que el cmdlet Remove-Variable marca el original para su recopilación.

Entonces, si necesita eliminar una cadena segura, una contraseña u otra información confidencial de la memoria, lo mejor es ir al recolector de basura .Net directamente después de haber cambiado la variable a $null.

$newVariable = $null
[System.GC]::Collect() # Call .Net Garbage Collector

Imprimir variable

Para imprimir una variable en PowerShell, simplemente escriba el nombre de la variable (con el signo $) en la consola para generar el valor. En un script, normalmente usaría el cmdlet Write-Host para generar el valor de una variable.

$numberVariable = "LazyAdmin"

# Directly in a console
$numberVariable

# In a script
Write-Host  $numberVariable

Cuando desee incluir la variable dentro de una cadena, deberá asegurarse de utilizar comillas dobles " ". Sólo entonces se utilizará el valor de la variable. Si usa comillas simples, entonces el nombre de la variable se usa como expresión.

$numberVariable = "LazyAdmin"
Write-Host  "You are reading $numberVariable"

# Result
You are reading LazyAdmin

Write-Host 'The variable $numberVariable contains a string'

# Result
The variable $numberVariable contains a string

Si la variable contiene un objeto, entonces puede generar las diferentes propiedades utilizando la notación .. Usted especifica el nombre de la variable seguido de un punto y el nombre de la propiedad. Tome la siguiente tabla hash:

$currentDC = [PSCustomObject]@{
    "HostName" = "DC1"
    "OS" = "Windows Server 2019"
    "OS Version" = "10.0.17763"
    "IP Address" = "192.168.1.1"
}

Para imprimir el HostName de la variable $currentDC, podemos escribir:

Write-Host $currentDC.Hostname

Pero cuando desee utilizar la misma propiedad dentro de una cadena, deberá envolverla entre paréntesis, así:

Write-Host "The hostname is $($currentDC.Hostname)"

Alcances variables

En PowerShell, tenemos tres ámbitos donde se puede ejecutar una variable:

  • Global: esto es efectivo en su sesión actual de PowerShell. Contiene las variables automáticas y de preferencia. Además, las variables definidas en su perfil de PowerShell se almacenan aquí.
  • Script: se crea mientras se ejecuta un archivo de script. El comando del script se ejecuta dentro del alcance del script.
  • Local: alcance actual, puede ser global, script o un alcance dentro de una función.

Las variables solo son visibles y accesibles en su ámbito actual y en sus ámbitos secundarios. Las variables dentro del alcance global siempre son accesibles dentro del script o alcance local.

Por ejemplo, cuando declaras una variable dentro de una función, no puedes acceder a ella fuera de esa función:

function Get-AuthToken {
    [CmdletBinding()]
    param (
        [string] $TenantId
    )
    # Some code to get a token
    $token = Get-MSCloudIdAccessToken -TenantId $TenantId 
}

Get-AuthToken

# The variable $token would be $null in this case
Get-MSCloudData -Token $token -User 'Test'

Para acceder o actualizar variables dentro de otro ámbito, deberá utilizar el modificador de ámbito para acceder a él. Entonces, para el ejemplo anterior, podemos almacenar la variable $token dentro del alcance Global. De esta manera también podemos usar $token dentro de otras funciones.

# Define the global variable
$global:token = $null

function Get-AuthToken {
    [CmdletBinding()]
    param (
        [string] $TenantId
    )
    # Some code to get a token
    $global:token = Get-MSCloudIdAccessToken -TenantId $TenantId 
}

# Run the function
Get-AuthToken

# $global:token will now contain the token that we need
Get-MSCloudData -Token $global:token -User 'Test'

Otra situación común es cuando necesita acceder a una variable fuera de un bucle ForEach-Object o fuera de un bloque de script Invoke-Command. En esos casos, puede acceder a la variable principal con la ayuda del modificador $using:. En el siguiente ejemplo, podemos acceder a los servicios dentro del Scriptblock con $using:services

$services = @(
        'EventSystem',
        'w32time', 
        'netlogon'
        )

    $stoppedServices = Invoke-Command -Computername $computername -ScriptBlock {Get-Service -Name $using:services | where {$_.Status -eq 'Stopped'}}

Intente minimizar el uso del alcance global tanto como sea posible, ya que hará que su código sea más difícil de leer y se podrá acceder a él desde cualquier parte del script. Si está utilizando variables globales en PowerShell, declarelas al comienzo del script.

Listar variables

¿Has olvidado el nombre de una variable? ¿O quieres saber qué variables has utilizado actualmente? Puede ver todas las variables en sus sesiones con el cmdlet Get-Variable. Esto enumerará todas las variables globales y locales y su sesión.

Si ejecuta el cmdlet sin ningún parámetro, devolverá todas las variables. Para ayudarle a encontrar una variable, el cmdlet Get-Variables viene con un par de parámetros. Por ejemplo, creamos una variable con la palabra número, pero no sabemos el nombre exacto.

Para encontrar el nombre de la variable, puede utilizar el parámetro -name y un * como comodín:

Get-Variable -name *number*

# Result
Name                           Value
----                           -----
numberVariable                 LazyAdmin

También puede utilizar el parámetro -Include o -Exclude para seleccionar solo las variables con (o sin) una cadena particular. Si solo desea ver el valor de una variable, utilice el parámetro -ValueOnly.

Concluyendo

Las variables son el pan de cada lenguaje de programación o scripting, incluido PowerShell. Le permiten almacenar información y utilizarla más adelante en su guión. Mantenga los nombres de sus variables siempre claros y significativos.

Las variables globales tienen su lugar, pero trate de minimizar su uso. Harán que la lectura de su código y la depuración sean más difíciles.

Espero que este artículo te haya resultado útil. Si tienes alguna pregunta, deja un comentario a continuación.

Artículos relacionados