並列処理にはいろいろは方法があるみたいだが、一番簡単そうな Start-Job を使ったサンプル
Function Get-Example1
{
Write-Verbose -Verbose "This is an example1"
Start-Sleep -Milliseconds 600
$A = Get-Date
Write-Host "This is an example2" $A.ToString()
}
Function Get-Example2
{
Write-Verbose -Verbose "This is an example2"
Start-Sleep -Milliseconds 300
$A = Get-Date
Write-Host "This is an example2" $A.ToString()
}
$block = (Get-Command Get-Example1).ScriptBlock
Start-Job -ScriptBlock $block -name "Get-Example1"
$block = (Get-Command Get-Example2).ScriptBlock
Start-Job -ScriptBlock $block -name "Get-Example2"
do{
# ジョブ取得
$Jobs = Get-Job
[Boolean]$IsRunning = $false
foreach( $Job in $Jobs ) {
if ( $Job.State -eq "Running")
{
$IsRunning = $true
}
}
if ( $Jobs -ne $null ) {
$Now = Get-Date
$Message = "未処理ジョブ " + $Now
write-host $Message
$AllJobs | Format-Table -Property Id, Name, State, Location -AutoSize | Out-Host
write-host ""
write-host ""
write-host ""
sleep 1
}
}
while ( $IsRunning -eq $true )
#各状態毎の結果確認を取得
# 正常終了したジョブ
$CompletedJobs = $Jobs | ? { $_.State -eq "Completed" }
# 異常終了したジョブ
$FailedJobs = Get-Job | ? { $_.State -eq "Failed" }
# 切断されたジョブ(ジョブ強制削除)
$DisconnectedJobs = Get-Job | ? { $_.State -eq "Disconnected" }
if ( $CompletedJobs -ne $null ) {
foreach ( $Job in $CompletedJobs ) {
$Location = $Job.Location
# 戻り値取得
# $CompletedJob = Receive-Job -Id $Job.Id
$Job.Name
write-host "[INFO]" $Location $Job.Name $Job.Id "Completed"
# Job 削除
Remove-Job -Id $Job.Id
}
}
if ( $FailedJobs -ne $null ) {
# 一覧表示
write-host "Fail Job"
$FailedJobs | Format-Table -Property Id, Name, State, Location -AutoSize | Out-Host
write-host ""
# 異常終了した Job を処理
foreach ( $Job in $FailedJobs ) {
$Location = $Job.Location
# 標準出力と戻り値を echo して Job 削除
write-host "[FAIL] $Location Failed"
write-host "[FAIL] ------------ $Location stdout echo Start ------------"
$Failechos = Receive-Job -Id $Job.Id
if ( $Failechos -ne $null ) {
foreach ( $Failecho in $Failechos ) {
write-host $Failecho
}
}
write-host "[FAIL] ------------ $Location stdout echo End ------------"
Remove-Job -Id $Job.Id
}
}
if ( $DisconnectedJobs -ne $null ) {
# 一覧表示
write-host "Disconnect Job"
$DisconnectedJobs | Format-Table -Property Id, Name, State, Location -AutoSize | Out-Host
write-host ""
# Job 強制削除
foreach ( $Job in $DisconnectedJobs ) {
Stop-Job -Id $Job.Id
Remove-Job -Id $Job.Id
}
}
コメント