PowerShell 独自実装関数(Function)を並列処理させるサンプル

EXCEL

 並列処理にはいろいろは方法があるみたいだが、一番簡単そうな 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
    }
}
ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました