同步PowerShell后台作业

时间:2013-01-15 23:17:37

标签: powershell powershell-remoting start-job

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

$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是否为此提供任何远程友好设施?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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