LoginSignup
2
2

More than 1 year has passed since last update.

[08] PowerShell実践例 ... 複数のPowerShellスクリプトを並列実行する

Last updated at Posted at 2021-07-31
本シリーズのトップページ
https://qiita.com/robozushi10/items/0b0605257ad39bc22895

はじめに

ある PowerShell スクリプトから、マルチプロセス (== バックグラウンド) で 2つの PowerShell スクリプトを並列実行させたときの実装を書き残しておく.
図や Bashスクリプト にすると次である.

ここでは並列実行される「Sub1」と「Sub2」の呼び出し処理についてである.
なお、呼び出し元である「Main」における「Sub1」と「Sub2」の終了待ちコードについては記載しない.

シーケンス図

Bashコード

./sub1.ps1 引数 &
$PID1=$!

./sub2.ps1 引数 &
$PID2=$!

wait $PID1 $PID2

実装

前提条件

ここでは次のようにする.

・プロセス「Sub1」に該当するコードを「sub1.ps1」とする
・プロセス「Sub2」に該当するコードを「sub1.ps2」とする

1. 「Main」から「Sub1」を別プロセスとして呼び出す

「Sub1」の引数として、作業ディレクトリ($W)のパスを渡す

# 「Sub1」に引数 $W を渡して別プロセスとして実行する.
$W = 'C:\work'
# Start-Process が別プロセスでの呼び出しとなる. Bash での「&」に該当する
$CLI1 = "Start-Process powershell -ArgumentList .\sub1.ps1, {0}" -f $W
# Bash での eval $CLI1 である. 今回は戻り値を受け取るようにした
$local:RET1 = Invoke-Expression $CLI1

2. 「Main」から「Sub2」を別プロセスとして呼び出す

「Sub2」の引数として、作業ディレクトリ($W)のパスを渡す

# 「Sub2」に引数 $W を渡して別プロセスとして実行する.
$W = 'C:\work'
# Start-Process が別プロセスでの呼び出しとなる. Bash での「&」に該当する
$CLI2 = "Start-Process powershell -ArgumentList .\sub2.ps1, {0}" -f $W
# Bash での eval $CLI2 である. 今回は戻り値を受け取るようにした
$local:RET2 = Invoke-Expression $CLI2

3. 「Main」で「Sub1」と「Sub2」の終了を待つ

このときは次のような実装をした

・「Sub1」および「Sub2」は、ジョブが終了したら Git リポジトリに結果を Push する.

・「Main」は 同 Git リポジトリを一定周期で監視する

・「Main」は待機時間の上限に逹したら、「Sub1」「Sub2」を強制停止させる

・「Main」では、「Sub1」「Sub2」が発生させた例外を捕捉するようにしている

 

コード全文

# 「Sub1」に引数 $W を渡して別プロセスとして実行する.
$W = 'C:\work'
# Start-Process が別プロセスでの呼び出しとなる. Bash での「&」に該当する
$CLI1 = "Start-Process powershell -ArgumentList .\sub1.ps1, {0}" -f $W
# Bash での eval $CLI1 である. 今回は戻り値を受け取るようにした
$local:RET1 = Invoke-Expression $CLI1

# 「Sub2」に引数 $W を渡して別プロセスとして実行する.
$W = 'C:\work'
# Start-Process が別プロセスでの呼び出しとなる. Bash での「&」に該当する
$CLI2 = "Start-Process powershell -ArgumentList .\sub2.ps1, {0}" -f $W
# Bash での eval $CLI2 である. 今回は戻り値を受け取るようにした
$local:RET2 = Invoke-Expression $CLI2

## 3. 「Main」で「Sub1」と「Sub2」の終了を待つ
<#
・「Sub1」および「Sub2」は、ジョブが終了したら Git リポジトリに結果を Push する.

・「Main」は 同 Git リポジトリを一定周期で監視する

・「Main」は待機時間の上限に逹したら、「Sub1」「Sub2」を強制停止させる

・「Main」では、「Sub1」「Sub2」が発生させた例外を捕捉するようにしている
#>


2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2