使用计时器

时间:2016-02-25 17:38:54

标签: powershell timer

我在ISE中以调试模式运行。我正在使用start-process从另一个辅助脚本启动一个单独的PowerShell脚本,并从主脚本中指定它的-file参数。我在主脚本中有一个计时器,我试图执行其他一些代码。

请考虑以下事项:

$timer = new-object timers.timer  
$timerID = [guid]::NewGuid()
$timer.Interval = 10000
$complete = 0 
$action = { 
write-host "Complete Ticker: $complete"
if($complete -eq 1) 
   { 
     write-host "Completed" 
     $timer.stop() 
     Unregister-Event $timerID
   } 
} 
Register-ObjectEvent -InputObject $timer -EventName elapsed –SourceIdentifier  $timerID -Action $action 
$timer.start() 
$shellScript = "-file C:\Test.ps1"
$powershellArguments = $shellScript
Start-Process "powershell.exe" -Wait -ArgumentList $powershellArguments
$complete = 1

成功调用另一个脚本并显示,但是除非启动脚本窗口以启动过程关闭,否则计时器似乎不会打勾。预期的结果是,间隔指定可以在操作中设置断点并在辅助脚本运行时命中。

上面的代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

启动PS的start-process使用-Wait参数。这会阻止$action运行。

我不确定代码是通过计时器和$action尝试完成的。它会做什么(如果不是-Wait),每十秒写一次“完成代码:0”,直到被调用的PS完成时它将写入“完成代码:1”。

如果被调用的PS运行时间超过10秒* height_of_the_parent_PS_console_in_lines,您将无法真正看到输出方式 - 屏幕将充满“完整代码:0”消息,您必须每隔10秒钟仔细观察一下屏幕的闪烁情况。即使被调用的PS比这更快地运行,输出也不会告诉被调用的PS将运行多长时间,或者即使它正在进行

从本质上讲,它有点像让用户观看der blinkenlights - 看起来很有趣,但信息量不大。

但是如果这是定时器代码应该做的事情,它可以在start-process之后用一个简单的循环替换,它检查被调用的PS是否已经完成,如果没有则输出“Complete Ticker:0”消息。

使用-passthru参数start-process,然后通过循环中返回的流程对象检查状态。