scriptblock上的新闭包

ste*_*tej 7 powershell events closures

考虑以下代码:

PS> $timer = New-Object Timers.Timer
PS> $timer.Interval = 1000
PS> $i = 1;
PS> Register-ObjectEvent $timer Elapsed -Action { write-host 'i: ' $i }.GetNewClosure()
PS> $timer.Enabled = 1
i:  1
i:  1
i:  1
 ...
# wait a couple of seconds and change $i
PS> $i = 2
i:  2
i:  2
i:  2
Run Code Online (Sandbox Code Playgroud)

我假设当我创建新的closure({ write-host 'i: ' $i }.GetNewClosure())值时$i将绑定到此闭包.但不是在这种情况下.我改变了值,write-host取新值.

另一方面,这有效:

PS> $i = 1;
PS> $action = { write-host 'i: ' $i }.GetNewClosure()
PS> &$action
i:  1
PS> $i = 2
PS> &$action
i:  1
Run Code Online (Sandbox Code Playgroud)

为什么它不适合Register-ObjectEvent

x0n*_*x0n 4

作业在动态模块中执行;模块具有隔离的会话状态,并共享对全局变量的访问。PowerShell 闭包仅在同一会话状态/作用域链中工作。烦人,是的。

-奥辛

ps 我说“作业”是因为事件处理程序实际上是本地作业,与使用 start-job 运行的脚本没有什么不同(仅限本地计算机,隐式,不使用 -computer localhost)