【发布时间】:2015-05-03 08:18:19
【问题描述】:
假设您在一个模块中定义了两个函数(即.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 的值,但不会捕获10:
PS C:\> f1 $x0
101
PS C:\> f1 $x0.GetNewClosure
101
发生这种情况是因为在f2 中调用.GetNewClosure() 会“覆盖”在f1 中捕获的$a1 的值。
有没有办法选择性地捕获脚本块中的变量?从这个例子开始,有没有办法在f1 中捕获$a1 和f2 中的$a2?
【问题讨论】:
-
我相信您正在寻找的概念是“范围”。 link
-
使用
$global:a1 = 10创建变量时可以在全局范围内创建变量你已经发现“当你使用调用运算符(&)运行一个函数或脚本时,它不是添加到当前作用域”和“要将函数添加到当前作用域,请在函数调用中的函数路径和名称之前键入一个点 (.) 和一个空格。”您还可以在创建变量后使用 Set-Variable 设置范围,或者在创建时使用 New-Variable 设置范围。 Another post about Scopes -
@BoogaRoo Scope 已在此问题的标签中。我不了解使用
.或Set-Variable如何帮助有选择地捕获脚本块上下文中的变量。你有一个例子来说明你的意思吗?
标签: variables powershell scope closures scriptblock