假设您在一个模块(即一个.psm1文件)中定义了两个函数:
function f1{
param($x1)
$a1 = 10
f2 $x1
}
function f2{
param($x2)
$a2 = 100
& $x2
}
现在假设您运行以下命令:
PS C:\> $a0 = 1
PS C:\> $x0 = {$a0+$a1+$a2}
PS C:\> f1 $x0
1
$x2尽管在内部调用,但仍保留命令行的上下文$f2。如果您更改&为..
在模块中替换$xn为$xn.GetNewClosure()然后调用会f1捕获100但 not的值10:
PS C:\> f1 $x0
101
PS C:\> f1 $x0.GetNewClosure
101
.GetNewClosure()发生这种情况是因为在内部调用f2“覆盖”了$a1捕获的值f1。
有没有办法选择性地捕获脚本块中的变量?从这个例子开始,有没有办法同时捕捉$a1内部f1和$a2内部f2?
延伸阅读
PowerShell 作用域并不简单。考虑这个不完整的因素列表中的可能性:
- 任何时候都可以有全局和模块范围层次结构的任意组合
.并且&调用对范围的影响不同,- 管道提供的复杂流控制意味着不同或相同范围层次结构的多个范围
begin、、process和end脚本块,甚至同一函数的多个调用可以同时处于活动状态
换句话说,PowerShell 作用域的工作描述抗拒简单性。