我需要从函数中设置一个全局变量,我不太清楚如何做到这一点。
# 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
我希望这个例子有意义。传递给函数的第三个变量是要设置的变量的名称。
答案 0 :(得分:84)
您可以使用Set-Variable
cmdlet。传递$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
答案 1 :(得分:36)
简单如下:
$A="1"
function changeA2 () { $global:A="0"}
changeA2
$A
答案 2 :(得分:17)
您必须将参数作为引用类型传递。
#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
答案 3 :(得分:16)
我在对自己的代码进行疑难解答时遇到了这个问题。
所以这不起作用......
$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
答案 4 :(得分:1)
@zdan。好答案。我会像这样改进它......
我认为在PowerShell中最接近真正返回值的是使用局部变量来传递值,永远不要使用return
,因为它可能是&# 39;损坏'通过任何形式的输出情况
function CheckRestart([REF]$retval)
{
# Some logic
$retval.Value = $true
}
[bool]$restart = $false
CheckRestart( [REF]$restart)
if ( $restart )
{
Restart-Computer -Force
}
$restart
变量用于调用函数CheckRestart
的任一侧,以明确变量的范围。按照惯例,返回值可以是声明的第一个或最后一个参数。我比上次更喜欢。
答案 5 :(得分:1)
latkin's answer中的第一个建议似乎很好,尽管我建议下面不那么啰嗦。
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
然而,他的第二个建议是关于编程实践不好,在这样的简单计算中是公平的,但是如果你想从变量中返回更复杂的输出呢?例如,如果您希望函数返回数组或对象,该怎么办?就我而言,PowerShell功能看起来很糟糕。这意味着除了使用全局变量从函数传回来之外别无选择。例如:
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
我知道这可能感觉有些偏离,但我觉得为了回答原始问题,我们需要确定全局变量是否是错误的编程实践,以及在更复杂的函数中是否有更好的方法。 (如果有的话,我会对此感兴趣。)
答案 6 :(得分:0)
对我而言,它起作用了:
function changeA2 () { $global:A="0"}
changeA2
$A