2

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

ジョブは、ミューテックス、ファイルシステム (同じマシン上にある場合)、または DB などを介して同期できますが、powershell がこれに対してリモート処理に適した機能を提供するかどうか疑問に思っています。

4

2 に答える 2

1

ジョブ オブジェクトは PowerShell セッション/実行空間に関連しているため、うまくいかないと思います。Start-Jobコマンドレットは、新しい実行空間 (通常は新しいプロセス) を起動します。PowerShell イベントも (ドキュメントによると) セッション固有であるように見えるため、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 に答える