繁体   English   中英

在PowerShell中创建批处理作业

[英]Creating batch jobs in PowerShell

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

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

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

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

$sp = get-process server-application
$sp.WaitForInputIdle()

您还可以使用Process.Start启动该过程,并使其返回确切的Process。 然后,您不需要get-process。

$sp = [diagnostics.process]::start("server-application", "params")
$sp.WaitForInputIdle()
$cp = [diagnostics.process]::start("client-application", "params")

@Lars Truijens建议

请记住,PowerShell可以访问.Net对象。 Blair Conrad建议的启动睡眠可以由对服务器进程的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文件必须位于您的Path上,否则您必须在运行它时指定其位置。 (哦,我假设启动服务器应用程序和启动客户端应用程序在您的Path上-如果没有,则还需要指定它们的完整路径。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM