Ámbitos en PowerShell

Logotipo de Powershell

No diría que Binance es la plataforma más fácil para principiantes, pero puede sentir que está seguro dentro de ella. Puede ...
Leer Más
Hoy, veremos una de las criptomonedas más exclusivas: Dogecoin y descubriremos dónde y cómo comprar Dogecoin. En esta guía, aprenderá ...
Leer Más
FP Markets fue fundada en 2005. La firma de corretaje FP Markets también es conocida como First Prudential Markets ...
Leer Más

En muchos lenguajes de programación, existe el concepto de talento. Definido como qué variables y funciones están disponibles en qué contexto. Un ejemplo es si una variable está arreglado para cada función adentro de un script de PowerShell, o solo una función definida. Los ámbitos de PowerShell abarcan varios ámbitos diferentes que se pueden usar, como ámbitos Completo, Recinto o Script.

¿Qué son los ámbitos de PowerShell?

Como se mencionó en la entrada, existen varios ámbitos primarios. Estos son globales, locales y de script e indican a PowerShell qué variables y funciones están disponibles en qué contexto. Cuando se hace remisión a ámbitos, normalmente se utilizan prefijos de ámbito para alcanzar variables fuera del ámbito recinto coetáneo. Esto es más obvio de entender mediante ejemplos.

Luces general

El talento general significa que una variable estará arreglado para todas las funciones y comandos independientemente de la ubicación, como $MyVar = $True o $Completo:MyVar = $True. Al iniciar PowerShell, todas las variables iniciales tienen un talento general. Si no hay ámbitos secundarios, general es lo mismo que ámbito recinto y de secuencia de comandos hasta que existan ámbitos secundarios.

# This is in the Completo scope
$MyVar = $True

Function Test-VariableScope {
	# When a variable is not found in the current scope, look up till it is found
	Write-Host "Completo Scope: $MyVar"
	# Redefine the variable in the Recinto scope
	$MyVar = $False
	Write-Host "Recinto Scope: $MyVar"
	Write-Host "Completo Scope: $($Completo:MyVar)"
}

Test-VariableScope

# Since the Locally scoped variable does not exist anymore, return the Completo scope
Write-Host "Completo Scope: $MyVar"

Luces recinto

El ámbito coetáneo es siempre recinto y, luego, todavía el ámbito predeterminado. Cuando no se usa ningún modificador de talento en una variable, el talento es recinto, como $MyVar = $True. El ámbito recinto puede ser difícil de entender ya que este ámbito es relativo a la ubicación coetáneo y una variable recinto puede estar en diferentes ámbitos al mismo tiempo.

# This is in the Recinto scope (and Completo scope since at root of script)
$MyVar = $True
Write-Host "Recinto Scope: $MyVar"
Write-Host "Recinto Scope Explicit: $($Recinto:MyVar)"
Function Test-VariableScope {
	# This variable is in the Recinto scope relative to Test-VariableScope
	$MyVar = $False
	Write-Host "Recinto Scope: $MyVar"
	Write-Host "Recinto Scope (Explicit): $($Recinto:MyVar)"
}

Test-VariableScope
# This variable is back to the recinto scope initially defined
Write-Host "Recinto Scope: $MyVar"
Write-Host "Recinto Scope Explicit: $($Recinto:MyVar)"

Cuando se proporciona un script, como . my-script.ps1, agregará la salida completa de ese script al ámbito recinto.

Luces del script

Finalmente, el talento del script es un poco más complicado. Es el talento del archivo de script antepasado más cercano o el talento general si no se ejecuta en un archivo de script como $script:var = $true. Los ámbitos Completo, Script y Recinto son los mismos para el $MyVar = $True variable cuando se usa en un solo script, e incluso en funciones.

# This is in the Script scope including Script and Recinto scope
$MyVar = $True
Write-Host "Script Scope: $($Script:MyVar)"

Function Test-VariableScope {
	# This variable is in the Recinto scope relative to Test-VariableScope
  $MyVar = $False
  # The Script scope references the same as $MyVar variable initially defined
	Write-Host "Script Scope: $($Script:MyVar)"
}

Test-VariableScope
# This variable is back to the Script scope initially defined
Write-Host "Script Scope: $($Script:MyVar)"

A diferencia de un script que agrega todo al ámbito recinto, utilizando el & El cámara de convocatoria ejecutará el script, pero dejará todo en el talento del script que es relativo al script en sí.

¿Qué son las opciones Privado, Uso, Flujo de trabajo y AllScope?

Inmediato con los alcances generales, existen varias opciones que pueden modificar la visibilidad o disponibilidad de variables. Entonces, ¿cuáles son estas diferentes opciones con visores?

El modificador de ámbito privado

Cuando define una variable o sobrenombre como privado, la variable o sobrenombre solo es visible y modificable desde adentro de ese contexto. Como puede ver en el sucesivo ejemplo, la lectura privada del

Remove-Variable TestVar
Remove-Variable TestVar2
Remove-Variable TestVar3

# Two ways to create a private variable, note that this is an Option and not a Scope (applied to a scoped variable)
New-Variable -Name 'TestVar' -Value $True -Scope 'Completo' -Option 'Private'
$Private:TestVar2 = $True

Write-Host "Completo Scope (TestVar): $TestVar"
Write-Host "Completo Scope (TestVar2): $TestVar"

$TestVar3 = $True

Function Test-Function {
  # Since the first two variables are private they are not seen
  Write-Host "Recinto Scope (TestVar): $TestVar"
  Write-Host "Recinto Scope (TestVar2): $TestVar2"
  # TestVar3 does not exist locally so PowerShell looks up and finds a non-Private variable in Completo
  Write-Host "Recinto Scope (TestVar3): $TestVar3"
}

Test-Function

¿Qué es el Modificador de uso?

Esta es una variable distinto que utilizan los cmdlets y las construcciones Invoke-Command, Start-Job, Start-ThreadJobo ForEach-Object -Parallel. Esto solo funcionará con Invoke-Command cuando se ejecuta en una computadora remota, como con el ComputerName parámetro.

# Normally the LocalCSVData variable will not be available to the scriptblock running on the remote computer without the Using modifier.
$LocalCSVData = Import-CSV -Path 'mydata.csv'

Invoke-Command -ComputerName 'RemoteComputer' -ScriptBlock {
	$Using:LocalCSVData | ForEach-Object {
		...do something...
	}
}

Flujo de trabajo y AllScope

Aunque se usa mucho menos, hay dos modificadores adicionales. los Workflow El modificador se usa para hacer remisión a variables en un flujo de trabajo de PowerShell (no arreglado en PowerShell Core / 7). los AllScope El modificador hará que una variable esté arreglado en todos los ámbitos. Esto todavía significa que si la variable se modifica en un ámbito secundario, se reflejará en los ámbitos raíz. Esta es una forma de evitar tener que priorizar una variable con general al intentar hacer remisión a ella en ámbitos secundarios.

Conclusión

Los ámbitos son enseres para cercar la visibilidad y disponibilidad de variables, funciones y sobrenombre. Los ámbitos todavía pueden ser problemáticos cuando no está claro en qué ámbito se encuentra una variable. ¡Esperamos que este artículo arroje poco de luz sobre cómo se utilizan los ámbitos en PowerShell y qué se puede hacer con ellos!

Deja un comentario