想象一下DOS样式的.cmd文件,它用于以正确的顺序启动相互依赖的窗口应用程序。在PowerShell中创建批处理作业
示例:
1)通过调用带有参数的exe来启动服务器应用程序。
2)等待服务器初始化(或固定时间)。
3)通过调用带参数的exe来启动客户端应用程序。
在PowerShell中完成这种批处理作业的最简单方法是什么?
想象一下DOS样式的.cmd文件,它用于以正确的顺序启动相互依赖的窗口应用程序。在PowerShell中创建批处理作业
示例:
1)通过调用带有参数的exe来启动服务器应用程序。
2)等待服务器初始化(或固定时间)。
3)通过调用带参数的exe来启动客户端应用程序。
在PowerShell中完成这种批处理作业的最简单方法是什么?
请记住,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")
要等待启动应用程序之间的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文件需要位于您的路径中,否则当您运行它时必须指定其位置。 (哦,我假设启动服务器应用程序和启动客户端应用程序在你的路径上 - 如果没有,你需要指定它们的完整路径。)
@Lars Truijens建议
记住的PowerShell可以访问 .NET对象。由Blair Conrad建议的 作为 可以被 取代,通过调用WaitForInputIdle 的服务器进程,您可以知道当服务器在 服务器准备就绪之前启动 的客户端。
这比睡眠一个固定的(或通过参数提供的)时间量更优雅。然而, WaitForInputIdle
仅适用于处理与用户接口 ,因此,一条消息 循环。
所以这可能无法正常工作,具体取决于启动服务器应用程序的特性。然而,正如拉尔斯向我指出的那样,这个问题涉及到一个窗口应用程序(当我读到这个问题时我错过了),所以他的解决方案可能是最好的。
是的,你是对的。然而,因为这个问题陈述的窗口应用程序,我认为是这样。 – 2008-09-08 13:39:57