在继续执行代码之前,如何等待一系列批处理文件完成?

时间:2018-12-14 17:28:36

标签: powershell batch-file

我有一系列15个批处理文件,它们需要作为Powershell脚本的一部分运行。我目前有这个版本,但是我按如下方式执行每个批处理文件:

Start-Process -FilePath "Script1.bat" -WorkingDirectory "C:\Root" -Wait
Start-Process -FilePath "Script2.bat" -WorkingDirectory "C:\Root" -Wait
Start-Process -FilePath "Script3.bat" -WorkingDirectory "C:\Root" -Wait

以此类推。

批处理文件将成千上万个SQL脚本集中到一个大脚本中,其中一些比其他脚本要慢得多(SQL填充5个不同的数据库,而1个则比其他4个大得多)

我正在尝试提高15个脚本的运行速度,我认为一个好主意是并行运行批处理文件,以便同时创建所有SQL文件,而不是同时创建这些SQL文件。顺序。为此,我删除了“ -Wait”,并可以看到所有命令行窗口同时打开。

我遇到的问题是,在创建SQL文件之后,我正在使用Copy-Item将脚本移动到所需位置。由于Copy-Item命令不再等待批处理文件执行,因此它试图在批处理文件完成创建之前从创建的文件夹复制SQL文件。

因此,基本上,我正在尝试想出一种“等待”方式来运行批处理文件的集合,以便可以确保在开始复制文件之前批处理文件已完成运行。我在线寻找了很长时间,并尝试通过“ Wait-Job”命令使用powershell Jobs,但是等待仅等待直到每个批处理文件都已执行,而不是直到它们完成为止。有人对如何实现这一目标有任何想法吗?

2 个答案:

答案 0 :(得分:0)

我将在这里使用一个事件。

请按照以下说明操作,而不用触发批处理:

$bat3 = Start-Process -FilePath "Script3.bat" -WorkingDirectory "C:\Root" -Wait -PassThru

注意,您要将过程对象保存到变量中,并添加了-PassThru参数(因此Commandlet将返回对象)。接下来,创建一个脚本块,其中包含您想要在批处理脚本完成时执行的操作:

$things-todo-when-batchfile-completes = {
    Copy-Item -Path ... -Destination ...
    Get-EventSubscriber | Unregister-Event
}

确保以Get-EventSubscriber | Unregister-Event结尾。接下来,创建一个事件处理程序:

$job = Register-ObjectEvent -InputObject $bat3 `
-eventname exited `
-SourceIdentifier Batch3Handler `
-Action $things-todo-when-batchfile-completes

现在,当任务完成运行时,处理程序将在$things-todo-when-batchfile-completes中执行操作。

这应该使您启动批处理文件,并在它们运行完毕后,执行您想要的文件副本。

Microsoft在文章Weekend Scripter: Playing with PowerShell Processes and Events中有一篇有关该技术的博客文章。

答案 1 :(得分:0)

我在想:将所有过程对象放在一个数组中...并等待它们全部退出...

$p = 1..15 | ForEach-Object {
    Start-Process -FilePath "Script$_.bat" -WorkingDirectory "C:\Root" -PassThru
}

while(($p.HasExited -eq $false).Count) {
    Start-Sleep -Milliseconds 100
}
相关问题