如果从同一会话启动了两个后台作业,其中一个如何确定另一个已完成? 最初我尝试过这样的事情:
$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是否为此提供任何远程友好设施?
答案 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