想象一下一个DOS风格的.cmd文件,用于按正确顺序启动相互依赖的窗口化应用程序。
示例:
1)通过调用带参数的exe来启动服务器应用程序。
2)等待服务器初始化(或一定时间)。
3)通过调用带参数的exe来启动客户端应用程序。
在PowerShell中实现此类批处理作业的最简单方法是什么?
想象一下一个DOS风格的.cmd文件,用于按正确顺序启动相互依赖的窗口化应用程序。
示例:
1)通过调用带参数的exe来启动服务器应用程序。
2)等待服务器初始化(或一定时间)。
3)通过调用带参数的exe来启动客户端应用程序。
在PowerShell中实现此类批处理作业的最简单方法是什么?
$sp = get-process server-application
$sp.WaitForInputIdle()
$sp = [diagnostics.process]::start("server-application", "params")
$sp.WaitForInputIdle()
$cp = [diagnostics.process]::start("client-application", "params")
@Lars Truijens建议
请记住,PowerShell可以访问.Net对象。 Blair Conrad建议的Start-Sleep可以被替换为调用服务器进程的WaitForInputIdle,以便在启动客户端之前知道服务器何时准备好。
这比固定时间(或通过参数提供)睡眠更优雅。但是,WaitForInputIdle
仅适用于具有用户界面和消息循环的进程。
因此,这可能不起作用,具体取决于launch-server-application的特性。然而,正如Lars向我指出的那样,问题涉及到一个窗口化应用程序(当我阅读问题时错过了),所以他的解决方案可能是最好的。
为了在启动应用程序之间等待10秒钟,请尝试:
launch-server-application serverparam1 serverparam2 ...
Start-Sleep -s 10
launch-client-application clientparam1 clientparam2 clientparam3 ...
launch-server-application $args[0] $args[1]
Start-Sleep -s 10
launch-client-application $args[2] $args[3] $args[4]
或者你可以选择在运行runlinkedapps.ps1的命令行中分发服务器和客户端参数。如果你想的话,甚至可以在这里传递延迟时间,而不是硬编码10
。
记住,你的 .ps1 文件需要在你的路径中,否则你将不得不在运行它时指定它的位置。(哦,我假设launch-server-application和launch-client-application在你的路径中 - 如果不是,你也需要指定它们的完整路径。)