61

関数からグローバル変数を設定する必要がありますが、その方法がよくわかりません。

# 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 に設定されています

この例が理にかなっていることを願っています。関数に渡される 3 番目の変数は、設定する変数の名前です。

4

7 に答える 7

97

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
于 2012-09-21T18:59:31.040 に答える
46

単純な:

$A="1"
function changeA2 () { $global:A="0"}
changeA2
$A
于 2014-05-13T12:28:57.577 に答える
18

引数を参照型として渡す必要があります。

#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
于 2012-09-21T18:20:50.957 に答える
1

@zdan。いい答えです。こんな感じに改善します...

PowerShellで真の戻り値に最も近いのは、ローカル変数returnを使用して値を渡し、出力状況によって「破損」する可能性があるため、決して使用しないことだと思います

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

$restart変数は、関数の呼び出しの両側で使用され、CheckRestart変数のスコープを明確にします。戻り値は、慣例により、宣言された最初または最後のパラメーターのいずれかになります。私は最後が好きです。

于 2015-05-14T02:49:02.350 に答える
0

私にとってはうまくいきました:

function changeA2 () { $global:A="0"}
changeA2
$A
于 2014-10-30T11:29:51.030 に答える