2

如果两个后台作业是从同一个会话开始的,其中一个如何确定另一个已经完成?最初我尝试过这样的事情:

$j1 = Start-Job {
    Start-Sleep -Seconds 5
    "j1 done"
}

$j2 = Start-Job {
    param($j)
    "j2 waiting..."
    $j | Wait-Job
    "j2 done"
} -ArgumentList $j1.Finished

$j1,$j2 | Receive-Job -Wait

当然它不起作用,因为$j2只获取了一个序列化的快照$j1(快照中的作业状态永远不会改变);此外,每个后台作业都有自己的作业存储库,因此$j对象在$j2.

作业可以通过互斥锁、文件系统(如果在同一台机器上)或数据库等进行同步,但我想知道 powershell 是否为此提供了任何远程处理友好的设施?

4

2 回答 2

1

我认为这不会奏效,因为作业对象与它们的 PowerShell 会话/运行空间相关。该Start-Jobcmdlet 启动一个新的运行空间(通常是一个新进程)。我也不相信 PowerShell 事件会起作用,因为它们也出现(根据文档)是特定于会话的。我会保持简单并使用文件 - 将路径传递给两个作业。

于 2013-01-15T23:50:22.433 回答
0

试试这个 - 在 PowerShell 3.0 和更新版本中:

$j1 = Start-Job {
    Start-Sleep -Seconds 5
    "j1 done"
}

$j2 = Start-Job {
    "j2 waiting..."
    $Using:j1 | Wait-Job
    "j2 done"
}

$j1,$j2 | Receive-Job -Wait
于 2016-08-21T13:06:16.130 回答