

workflow とForEach -parallelで並列して複数の ps1スクリプト を実行しようと思います。各ps1スクリプトは戻り値として
$True あるいは $Flaseを返します。$Flaseをカウントしようと思いますのが、スコープがスクリプト内の変数を使用することができずに困っています。

以下のように Errors をカウントしたいのですができません。何かよいアイディアはないでしょうか。

[code]

    workflow func1 {
        $Errors = 0
        ForEach -parallel ($i in 1..30) {
            InlineScript{ 
                $ret = c:\scripts\test2.ps1
                if (!$ret)
                {
                    $Errors +=1
                }
                write-host $Errors
            }
        }
    
    
    }
    
    func1
    
[/code]

以下のページを見ると、"there is no $global scope"と記載されています。  
<https://devblogs.microsoft.com/scripting/powershell-workflows-restrictions/>


CC BY-SA 4.0
2019-03-11T13:17:08.827
53367
2023-11-22T09:07:15.987
2019-03-11T13:26:05.120
4236
32503
question
powershell
Powershell で workflowにおけるマルチスレッド処理での共通の変数


ここ [Variables in an InlineScript Activity](https://docs.microsoft.com/en-
us/previous-versions/windows/it-pro/windows-
server-2012-R2-and-2012/jj574187\(v=ws.11\)#variables-in-an-inlinescript-
activity) に使い方が解説されているようです。

`InlineScript` の中から `workflow` 変数にアクセスするには、最初に一度だけ `$Using:` を付ける必要があるとのこと。

また、`InlineScript` の中で変更した値を `workflow` 変数に反映させるには、`InlineScript`
の戻り値として通知し、代入するようです。

ちなみに、`Parallel` の `Sequence` の中から `workflow` 変数にアクセスするには、`$Workflow:`
を付ける必要があるそうなので、もしかしたら両方組み合わせるとか、もっと別の何かが必要になるかもしれません。  
[Variables in Parallel and Sequence Statements](https://docs.microsoft.com/en-
us/previous-versions/windows/it-pro/windows-
server-2012-R2-and-2012/jj574187\(v=ws.11\)#variables-in-parallel-and-
sequence-statements)

[PowerShell における Windows Workflow Foundation 4.0 (WF)
利用のすすめ](https://tech.guitarrapc.com/entry/2013/09/08/170940)
の「Workflow構文内での変数指定」の項に日本語の解説がありましたが、ドンピシャの説明とはいかないようです。

`InlineScript` の中でカウントアップや表示するよりも、各ps1の戻り値を更に `InlineScript`
の戻り値にして、ForEachループの中で処理する方が良さそうです。

あと上記日本語記事によると、`Write-Host` は workflow
の中では使えないそうですが、版数アップ等で使えるようになったのでしょうか。まだ使えないなら `Write-Output` や `Write-
Warning`、`Write-Verbose` を利用するように書いてありますね。

他にちょっと性質の違う参考Q&A  
[Foreach -parallel object](https://stackoverflow.com/q/37881875/9014308)

* * *

スクリプトを Get-Random に置き換え、変数は最後に結果だけ出力するように作ってみました。  
Windows10, PowerShell5.1 のコンソール画面で動きました。

[code]

    workflow func1 {
        $Errors = 0
        ForEach -parallel ($i in 1..30) {
            $ret = InlineScript { Get-Random -Minimum 1 -Maximum 20 }
            $retnum = [int]$ret
            if ($retnum -gt 10)
            {
                $Workflow:Errors += 1
            }
        }
        InlineScript { Write-Host $Using:Errors }
    }
    
[/code]


CC BY-SA 4.0
2019-03-11T16:08:08.730
53370
2019-03-12T01:22:41.977
2019-03-12T01:22:41.977
26370
26370
53367
answer