5

想象一个 DOS 风格的 .cmd 文件,它用于以正确的顺序启动相互依赖的窗口应用程序。

示例:
1) 通过调用带参数的 exe 来启动服务器应用程序。
2)等待服务器初始化(或固定的时间)。
3) 通过调用带参数的 exe 启动客户端应用程序。

在 PowerShell 中完成此类批处理作业的最简单方法是什么?

4

3 回答 3

5

请记住,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")
于 2008-09-08T12:00:05.800 回答
1

@Lars Truijens 建议

请记住,PowerShell 可以访问 .Net 对象。Blair Conrad 建议的 Start-Sleep 可以通过调用服务器进程的 WaitForInputIdle 来代替,这样您就可以在启动客户端之前知道服务器何时准备就绪。

这比在固定(或通过参数提供)的时间内休眠更优雅。但是, WaitForInputIdle

仅适用于具有用户界面的进程,因此也适用于消息循环。

所以这可能不起作用,具体取决于启动服务器应用程序的特性。但是,正如 Lars 向我指出的那样,该问题涉及一个窗​​口应用程序(我在阅读该问题时错过了该应用程序),因此他的解决方案可能是最好的。

于 2008-09-08T12:45:30.140 回答
0

要在启动应用程序之间等待 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 在您的路径上 - 如果不是,您还需要指定它们的完整路径。)

于 2008-09-08T11:37:46.493 回答