我正在使用 PowerShell ISE(PS 版本 5.0)。如果我运行这段代码:
Write-Host "This"
它输出:
This
如果我像这样修改脚本:
Write-Host "That"
它输出:
That
伟大的。正如预期的那样。现在,如果我有这段代码:
$Form = New-Object System.Windows.Forms.Form
$Timer = New-Object System.Windows.Forms.Timer
$Timer.Add_Tick(
{
&{
Write-Output "Here"
$Form.Close()} | Write-Host
})
$Timer.Interval = 3000
$Timer.start()
$result = $Form.ShowDialog()
它输出:
Here
如果我改变anything在脚本中,例如"Here"
to "There"
or $Timer.Interval = 3000
to $Timer.Interval = 4000
并运行它,它做了两个意想不到的事情:1.)它没有在适当的时间内显示表单,而是在屏幕上短暂闪烁,2.)它输出原始内容Here
代替There
。如果我关闭 ISE 并重新打开它,脚本将按预期运行。
到底是怎么回事?
tl;dr:
-
The 定时器实例被创建在session scope,
- 无论您是否在 ISE 中运行脚本,
- 以及引用它的任何变量是否在范围内。
始终丢弃计时器(或者至少禁用它)以防止它生成更多事件。
一般来说- 虽然那是not造成当前问题的原因 - 请注意在 ISE 中运行脚本隐式点源 it,以便重复执行运行在same范围,具有先前变量值挥之不去,这可能会导致意外的行为。
您的代码永远不会处理(或禁用)计时器,因此:
这解释了您的症状:排队,原创事件火即刻一旦您显示表格again.
解决办法是处理计时器一旦它履行了职责并触发了事件(一次):
Add-Type -AssemblyName System.Windows.Forms
$Form = New-Object System.Windows.Forms.Form
$Timer = New-Object System.Windows.Forms.Timer
$Timer.Add_Tick({
& {
Write-Output "Here"
$Form.Close()
} | Write-Host
})
$Timer.Interval = 3000
$Timer.Start()
$result = $Form.ShowDialog()
$Timer.Dispose() # IMPORTANT: Dispose of the timer so it won't generate more events.
即使使用上述 ISE 的隐式源行为,重复调用此代码也能按预期工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)