想象一个 DOS 风格的 .cmd 文件,它用于以正确的顺序启动相互依赖的窗口应用程序。
示例:
1) 通过调用带参数的 exe 来启动服务器应用程序。
2)等待服务器初始化(或固定的时间)。
3) 通过调用带参数的 exe 启动客户端应用程序。
在 PowerShell 中完成此类批处理作业的最简单方法是什么?
想象一个 DOS 风格的 .cmd 文件,它用于以正确的顺序启动相互依赖的窗口应用程序。
示例:
1) 通过调用带参数的 exe 来启动服务器应用程序。
2)等待服务器初始化(或固定的时间)。
3) 通过调用带参数的 exe 启动客户端应用程序。
在 PowerShell 中完成此类批处理作业的最简单方法是什么?
请记住,PowerShell 可以访问 .Net 对象。Blair Conrad建议的 Start-Sleep可以通过调用服务器进程的WaitForInputIdle来代替,这样您就可以在启动客户端之前知道服务器何时准备就绪。
$sp = get-process server-application
$sp.WaitForInputIdle()
您还可以使用Process.Start启动进程并让它返回确切的进程。然后你不需要获取过程。
$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
仅适用于具有用户界面的进程,因此也适用于消息循环。
所以这可能不起作用,具体取决于启动服务器应用程序的特性。但是,正如 Lars 向我指出的那样,该问题涉及一个窗口应用程序(我在阅读该问题时错过了该应用程序),因此他的解决方案可能是最好的。
要在启动应用程序之间等待 10 秒,请尝试
launch-server-application serverparam1 serverparam2 ...
Start-Sleep -s 10
launch-client-application clientparam1 clientparam2 clientparam3 ...
如果您想创建一个脚本并传入参数,请创建一个名为 runlinkedapps.ps1 (或其他)的文件,其中包含以下内容:
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 在您的路径上 - 如果不是,您还需要指定它们的完整路径。)