在 PowerShell 中创建批处理作业
Posted
技术标签:
【中文标题】在 PowerShell 中创建批处理作业【英文标题】:Creating batch jobs in PowerShell 【发布时间】:2010-09-08 03:25:58 【问题描述】:想象一个 DOS 风格的 .cmd 文件,它用于以正确的顺序启动相互依赖的窗口应用程序。
示例: 1) 通过调用带参数的 exe 启动服务器应用程序。 2) 等待服务器初始化(或固定时间)。 3) 通过调用带参数的 exe 启动客户端应用程序。
在 PowerShell 中完成此类批处理作业的最简单方法是什么?
【问题讨论】:
【参考方案1】:请记住,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")
【讨论】:
【参考方案2】:@Lars Truijens 建议
记住 PowerShell 可以访问 .Net 对象。开始睡眠为 布莱尔康拉德建议可以 替换为对 WaitForInputIdle 的调用 服务器进程,所以你知道什么时候 服务器在启动前已准备就绪 客户。
这比在固定(或通过参数提供)的时间内休眠更优雅。然而, WaitForInputIdle
仅适用于有用户的进程 接口,因此,消息 循环。
所以这可能不起作用,具体取决于启动服务器应用程序的特性。但是,正如 Lars 向我指出的那样,该问题涉及一个 windowed 应用程序(我在阅读该问题时错过了该应用程序),因此他的解决方案可能是最好的。
【讨论】:
是的,你是对的。但是,由于问题说明了窗口应用程序,我认为是这种情况。 太棒了,拉斯。我把它读作“Windows”。哎呀。不过,有时它可能对某人有用的信息...... 如果您正在启动的进程是命令行进程,您可以使用 $sp.WaitForExit()【参考方案3】:要在启动应用程序之间等待 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 在您的路径上 - 如果不是,您还需要指定它们的完整路径。)
【讨论】:
以上是关于在 PowerShell 中创建批处理作业的主要内容,如果未能解决你的问题,请参考以下文章
从 VS 2012 在 SQL Server 2012 数据库项目中创建 SQL 代理作业