尽管其他帖子提供了许多有用的信息,但它们似乎只是使您脱离了RTFM。
没有提到的答案是我发现最有用的答案!
([ref]$var).value = 'x'
不管它处于什么范围,这都会修改$ var的值 。只是事实确实已经存在。使用OP的示例:
$array=@("g")
function foo()
{
([ref]$array).Value += "h"
Write-Host $array
}
& {
([ref]$array).Value +="s"
Write-Host $array
}
foo
Write-Host $array
产生:
g s
g s h
g s h
说明:
([ref] $ var)为您提供了一个指向变量的指针。由于这是读取操作,因此它将解析为实际创建该名称的最新作用域。它还解释了如果变量不存在的错误,因为[ref]不能创建任何东西,它只能返回对已经存在的对象的引用。
然后,.value带您到保存变量定义的属性;然后可以进行设置。
您可能会想做这样的事情,因为它有时看起来很有效。
([ref]$var) = "New Value"
别!!!!
看起来可行的实例是一种错觉,因为PowerShell只能在某些非常狭窄的情况下(例如在命令行上)执行某些操作。你不能指望它。实际上,它在OP示例中不起作用。