我在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
成功调用另一个脚本并显示,但是除非启动脚本窗口以启动过程关闭,否则计时器似乎不会打勾。预期的结果是,间隔指定可以在操作中设置断点并在辅助脚本运行时命中。
上面的代码有什么问题吗?
答案 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
,然后通过循环中返回的流程对象检查状态。