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
?
作业在动态模块中执行;模块具有隔离的会话状态,并共享对全局变量的访问。PowerShell 闭包仅在同一会话状态/作用域链中工作。烦人,是的。
-奥辛
ps 我说“作业”是因为事件处理程序实际上是本地作业,与使用 start-job 运行的脚本没有什么不同(仅限本地计算机,隐式,不使用 -computer localhost)
归档时间: |
|
查看次数: |
521 次 |
最近记录: |