从另一个PowerShell运行空间

时间:2015-12-29 11:40:42

标签: powershell timer runspace

我目前正在使用Powershell中的System.Timers.Timer对象。

我遇到的问题是,当你注册到" Elapsed"事件

Register-ObjectEvent -InputObject $timer -EventName Elapsed -SourceIdentifier ThirtySecTimer -Action $scriptblock

scriptblock将在不同的Powershell Runspace / thread中运行 这里的问题是,我想修改scriptblock中的timer对象,基本上创建一个更短的Intervals循环,直到它达到x秒并且脚本停止

$action={
    $timer.stop()
    Show-MsgBox -Prompt "time's up" #selfdefined function using Windows Forms
    $timer.interval=$interval - 1000
    $timer.start()
}

我找到了定义运行空间的选项,但我不确定我是否可以通过自定义的运行空间使用计时器对象。此外,我认为使用运行空间对于此任务来说有点过头了。

还有另一种(更简单的)方法可以让它发挥作用吗? 如果没有,是否可以通过自定义的运行空间来操作计时器对象? (如果我不得不使用运行空间,我可能以不同的方式做到这一点,但对未来的了解很好)

1 个答案:

答案 0 :(得分:1)

$timer本身作为sender作为事件处理程序的第一个参数传递。这会自动填充操作块内的$Sender自动变量。

您可以修改该对象引用,而不是直接解除引用$timer

# Create a timer starting at a 10 second interval
$timer = New-Object System.Timers.Timer
$timer.Interval = 10000

# Register the event handler
Register-ObjectEvent $timer Elapsed timersourceid -Action {
    Write-Host "Event triggered at $(Get-Date|Select-Object -ExpandProperty TimeOfDay)"

    $Sender.Stop()
    if($Sender.Interval -ge 1000)
    {
        $Sender.Interval = $Sender.Interval - 1000
        $Sender.Start()
    }
    else
    {
        Write-Host "Timer stopped"
    }
}

您还可以通过在Action scriptblock中定义一个param块来覆盖变量名,第一个参数始终是发送者,第二个参数是EventArgs(相当于$EventArgs自动变量):

Register-ObjectEvent $Timer Elapsed SourceId -Action {
    param($s,$e)

    $s.Stop()
    Write-Host "Event was raised at $($e.SignalTime)"
}