2008-09-08 144 views
5

想象一下DOS样式的.cmd文件,它用于以正确的顺序启动相互依赖的窗口应用程序。在PowerShell中创建批处理作业

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

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

回答

5

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

1

@Lars Truijens建议

记住的PowerShell可以访问 .NET对象。由Blair Conrad建议的 作为 可以被 取代,通过调用WaitForInputIdle 的服务器进程,您可以知道当服务器在 服务器准备就绪之前启动 的客户端。

这比睡眠一个固定的(或通过参数提供的)时间量更优雅。然而, WaitForInputIdle

仅适用于处理与用户接口 ,因此,一条消息 循环。

所以这可能无法正常工作,具体取决于启动服务器应用程序的特性。然而,正如拉尔斯向我指出的那样,这个问题涉及到一个窗口应用程序(当我读到这个问题时我错过了),所以他的解决方案可能是最好的。

+0

是的,你是对的。然而,因为这个问题陈述的窗口应用程序,我认为是这样。 – 2008-09-08 13:39:57