Установка глобальной переменной PowerShell из функции, где глобальное имя переменной является переменной, переданной функции

Мне нужно установить глобальную переменную из функции и не совсем уверен, как это сделать.

# 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
}

Вызвать функцию:

foo 1 2 $global:var3

Конечный результат:

$global: значение var3 равно 3

Или, если я вызываю функцию следующим образом:

foo 1 2 $global:var2

Конечный результат:

$global: значение var2 равно 3

Я надеюсь, что этот пример имеет смысл. Третьей переменной, переданной функции, является имя переменной, которую она должна установить.

Ответ 1

Вы можете использовать командлет Set-Variable. Передача $global:var3 отправляет значение $var3, что не то, что вы хотите. Вы хотите отправить имя.

$global:var1 = $null

function foo ($a, $b, $varName)
{
   Set-Variable -Name $varName -Value ($a + $b) -Scope Global
}

foo 1 2 var1

Это не очень хорошая практика программирования. Ниже было бы намного проще и с меньшей вероятностью ввести ошибки позже:

$global:var1 = $null

function ComputeNewValue ($a, $b)
{
   $a + $b
}

$global:var1 = ComputeNewValue 1 2

Ответ 2

Проще, чем:

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

Ответ 3

Вам нужно передать свои аргументы в качестве ссылочных типов.

#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

Ответ 4

Я столкнулся с этим вопросом, когда исправлял свой собственный код.

Итак, это НЕ работает...

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

Этот APPEARS работает, но только в PowerShell ISE:

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

На самом деле это работает как в ISE, так и в командной строке:

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

Ответ 5

@zdan. Хороший ответ. Я бы лучше это сделал... Я думаю, что ближе всего вы можете прийти к истинному возвращаемому значению в PoSH, чтобы использовать локальную переменную для передачи значения и никогда не использовать return, поскольку он может быть "поврежден" любым способом выходных ситуаций.

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

Переменная $restart используется с обеих сторон вызова функции CheckRestart, чтобы очистить область действия переменной. Возвращаемое значение может быть условно либо первым, либо последним объявленным параметром. Я предпочитаю последний.

Ответ 6

Для меня это сработало:

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