【发布时间】:2010-09-08 03:25:58
【问题描述】:
想象一个 DOS 风格的 .cmd 文件,它用于以正确的顺序启动相互依赖的窗口应用程序。
示例:
1) 通过调用带参数的 exe 启动服务器应用程序。
2) 等待服务器初始化(或固定时间)。
3) 通过调用带参数的 exe 启动客户端应用程序。
在 PowerShell 中完成此类批处理作业的最简单方法是什么?
【问题讨论】:
标签: powershell batch-file
想象一个 DOS 风格的 .cmd 文件,它用于以正确的顺序启动相互依赖的窗口应用程序。
示例:
1) 通过调用带参数的 exe 启动服务器应用程序。
2) 等待服务器初始化(或固定时间)。
3) 通过调用带参数的 exe 启动客户端应用程序。
在 PowerShell 中完成此类批处理作业的最简单方法是什么?
【问题讨论】:
标签: powershell batch-file
请记住,PowerShell 可以访问 .Net 对象。 Blair Conrad 建议的 Start-Sleep 可以替换为对服务器进程的 WaitForInputIdle 的调用,以便在启动客户端之前知道服务器何时准备就绪。
$sp = get-process server-application
$sp.WaitForInputIdle()
您也可以使用Process.Start 启动进程并让它返回确切的进程。那么你就不需要get-process了。
$sp = [diagnostics.process]::start("server-application", "params")
$sp.WaitForInputIdle()
$cp = [diagnostics.process]::start("client-application", "params")
【讨论】:
@Lars Truijens 建议
记住 PowerShell 可以访问 .Net 对象。开始睡眠为 布莱尔康拉德建议可以 替换为对 WaitForInputIdle 的调用 服务器进程,所以你知道什么时候 服务器在启动前已准备就绪 客户。
这比在固定(或通过参数提供)的时间内休眠更优雅。然而, WaitForInputIdle
仅适用于有用户的进程 接口,因此,消息 循环。
所以这可能不起作用,具体取决于启动服务器应用程序的特性。但是,正如 Lars 向我指出的那样,该问题涉及一个 windowed 应用程序(我在阅读该问题时错过了该应用程序),因此他的解决方案可能是最好的。
【讨论】:
要在启动应用程序之间等待 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 在您的路径上 - 如果不是,您还需要指定它们的完整路径。)
【讨论】: