PowerShell Scopesのドキュメントを理解していれば、$using
を使用して開始されたスレッドからスコープ変数に割り当てることができるはずStart-ThreadJob
です。ドキュメントには次のように書かれています(強調鉱山):
Using
スコープ修飾子は、次のコンテキストでサポートされています。
- ...
Start-ThreadJob
またはForEach-Object -Parallel
(別のスレッド セッション)を介して開始されたスレッド ジョブコンテキストに応じて、埋め込み変数の値は、呼び出し元のスコープ内のデータの独立したコピーか、それへの参照のいずれかになります。
...
スレッド セッションでは、参照によって渡されます。これは、別のスレッドで呼び出しスコープ変数を変更できることを意味します。変数を安全に変更するには、スレッドの同期が必要です。
それでも、以下は実行に失敗します:
$foo = 1
Start-ThreadJob {
Write-Host $using:foo
$using:foo = 2
} | Wait-Job | Out-Null
Write-Host $foo
次のエラーが発生$using:foo = 2
します。
代入式が無効です。代入演算子への入力は、変数やプロパティなど、代入を受け入れることができるオブジェクトでなければなりません。
変数の印刷はWrite-Host $using:foo
正しく機能します。
PowerShell 7.1 を使用しています。