variable print definir powershell

print - Establecer una variable global de PowerShell a partir de una función donde el nombre de la variable global es una variable que se pasa a la función



powershell print variable (7)

Necesito establecer una variable global a partir de una función y no estoy muy seguro de cómo hacerlo.

# Set variables $global:var1 $global:var2 $global:var3 function foo ($a, $b, $c) { # Add $a and $b and set the requested global variable to equal to it $c = $a + $b }

Llame a la función:

foo 1 2 $global:var3

Resultado final:

$ global: var3 se establece en 3

O si llamé a la función así:

foo 1 2 $global:var2

Resultado final:

$ global: var2 se establece en 3

Espero que este ejemplo tenga sentido. La tercera variable que se pasa a la función es el nombre de la variable que debe establecer.


@zdan. Buena respuesta. Lo mejoraría así ... Creo que lo más cerca que puede llegar a un verdadero valor de retorno en PoSH es usar una variable local para pasar el valor y nunca usar el return ya que puede estar ''corrompido'' de cualquier manera de situaciones de salida

function CheckRestart([REF]$retval) { # Some logic $retval.Value = $true } [bool]$restart = $false CheckRestart( [REF]$restart) if ( $restart ) { Restart-Computer -Force }

La variable $restart se usa en cualquier lado de la llamada a la función CheckRestart dejando en claro el alcance de la variable. El valor de retorno puede ser, por convención, el primer o último parámetro declarado. Prefiero el último.


Lamentablemente, no puedo comentar sobre la respuesta de latkin debido a mi reputación, así que tuve que agregar mi propia respuesta. Su primera sugerencia parece buena, aunque sugeriría la manera menos prolija a continuación.

PS c:/temp> $global:test="one" PS c:/temp> $test one PS c:/temp> function changet() {$global:test="two"} PS c:/temp> changet PS c:/temp> $test two

Su segunda sugerencia, sin embargo, acerca de ser una mala práctica de programación, es bastante justa en un simple cálculo como este, pero ¿y si quieres devolver un resultado más complicado de tu variable? Por ejemplo, ¿qué pasa si quieres que la función devuelva una matriz o un objeto? Ahí es donde, para mí, las funciones de powershell parecen fallar lamentablemente. Lo que significa que no tienes otra opción que pasarla de la función usando una variable global. Por ejemplo:

PS c:/temp> function changet([byte]$a,[byte]$b,[byte]$c) {$global:test=@(($a+$b),$c,($a+$c))} PS c:/temp> changet 1 2 3 PS c:/temp> $test 3 3 4 PS C:/nb> $test[2] 4

Sé que esto puede parecer una pequeña digresión, pero creo que para responder a la pregunta original necesitamos establecer si las variables globales son malas prácticas de programación y si, en funciones más complejas, hay una mejor manera. (Si hay uno, estaría interesado aquí).


Me encontré con esta pregunta al solucionar mi propio código.

Entonces esto NO funciona ...

$myLogText = "" function AddLog ($Message) { $myLogText += ($Message) } AddLog ("Hello") Write-Host $myLogText

Esto APARECE para funcionar, pero solo en el ISE de PowerShell :

$myLogText = "" function AddLog ($Message) { $global:myLogText += ($Message) } AddLog ("Hello") Write-Host $myLogText

Esto es realmente lo que funciona tanto en ISE como en la línea de comandos:

$global:myLogText = "" function AddLog ($Message) { $global:myLogText += ($Message) } AddLog ("Hello") Write-Host $global:myLogText


Para mí funcionó:

function changeA2 () { $global:A="0"} changeA2 $A


Puede usar el cmdlet Set-Variable . Pasando $global:var3 envía el valor de $var3 , que no es lo que quieres. Quieres enviar el nombre

$global:var1 = $null function foo ($a, $b, $varName) { Set-Variable -Name $varName -Value ($a + $b) -Scope Global } foo 1 2 var1

Sin embargo, esta no es una práctica de programación muy buena. A continuación, sería mucho más sencillo y menos probable que presente errores más adelante:

$global:var1 = $null function ComputeNewValue ($a, $b) { $a + $b } $global:var1 = ComputeNewValue 1 2


Tan simple como:

$A="1" function changeA2 () { $global:A="0"} changeA2 $A


Tendrás que pasar tus argumentos como tipos de referencia.

#First create the variables (note you have to set them to something) $global:var1 = $null $global:var2 = $null $global:var3 = $null #The type of the reference argument should be of type [REF] function foo ($a, $b, [REF]$c) { # add $a and $b and set the requested global variable to equal to it # Note how you modify the value. $c.Value = $a + $b } #You can then call it like this: foo 1 2 [REF]$global:var3