使用PowerShell创建批处理作业

5

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

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

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

3个回答

5
记住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")

1

@Lars Truijens建议

请记住,PowerShell可以访问.Net对象。 Blair Conrad建议的Start-Sleep可以被替换为调用服务器进程的WaitForInputIdle,以便在启动客户端之前知道服务器何时准备好。

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

仅适用于具有用户界面和消息循环的进程。

因此,这可能不起作用,具体取决于launch-server-application的特性。然而,正如Lars向我指出的那样,问题涉及到一个窗口化应用程序(当我阅读问题时错过了),所以他的解决方案可能是最好的。


是的,你说得对。然而,由于问题中提到了窗口应用程序,我假设这是情况。 - Lars Truijens
很好的观点,Lars。我把它读成了“Windows”。糟糕。不过,这可能对某个人在某个时候是有用的信息... - Blair Conrad
如果您启动的进程是命令行进程,您可以使用 $sp.WaitForExit()。 - Omar Shahine

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在你的路径中 - 如果不是,你也需要指定它们的完整路径。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接