在 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 代理作业

在 Powershell 中创建 PerformanceCounterCategory

在 Powershell 中创建多维哈希表数组

是否可以在 PowerShell 中创建不可修改的哈希表?

powershell PowerShell:在“发送到”文件夹中创建“发送到”快捷方式。