複数のコンピュータで同時に PowerShell スクリプトを実行する方法

複数のコンピュータで同時に PowerShell スクリプトを実行する方法

私が持っている PowerShell スクリプトを複数のコンピューターで同時に実行しようとしています。現在、PowerShell バージョン 5 を使用しています。

ログをよりよく理解するために、バックグラウンド プロセスなしで実行できるかどうかを知りたいです。

$computers = @("Hostname1", "Hostname2", "Hostname3")
$scriptPath = "C:\Projects\Scripts\Environment\InstallEnvironment.ps1"

$scriptBlock = {
    param (
        [string]$scriptPath
    )
    try {
        # Execute the script
        & $scriptPath
    }
    catch {
        Write-Host "Error occurred on $($env:COMPUTERNAME): $_"
    }
}
foreach ($computer in $computers) {
    Start-Job -ScriptBlock $scriptBlock -ArgumentList $scriptPath -Name $computer
}
while (Get-Job -State Running) {
    Start-Sleep -Milliseconds 100
}
Get-Job | Receive-Job
Get-Job | Remove-Job

ご協力いただければ幸いです。

答え1

3つの選択肢があると思います:

  • Jobs を続行しますが、コードを少しリファクタリングします
  • ForEach-Object -ParallelPowerShell 7 での使用
  • 使ってみるワークフローPowerShell 5では、foreach -Parallel ($a in $x) {}別の種類の頭痛の種である

Invoke-Command以下は、ジョブを作成してWait-Job待機するために使用するコード スニペットです。

$computers = @("Hostname1", "Hostname2", "Hostname3")
$scriptPath = "C:\Projects\Scripts\Environment\InstallEnvironment.ps1"
$scriptBlock = {
    try {
        & $Using:scriptPath
    }
    catch {
        Write-Host "Error occurred on $($env:COMPUTERNAME): $_"
    }
}
$Jobs = Invoke-Command -ScriptBlock $scriptBlock -ComputerName $computers -AsJob
# Results (Logs) are stored in the $Result variable
$Result = $Jobs | Wait-Job | Receive-Job
$Jobs | Remove-Job

の使用方法は次のとおりです。ForEach-Object -Parallelただし、注意が必要です。これを使用すると、通常のようにコンソールに出力できない場合があり、他の種類の問題が発生する可能性があります。

#Requires -Version 7
$computers = @("Hostname1", "Hostname2", "Hostname3")
$scriptPath = "C:\Projects\Scripts\Environment\InstallEnvironment.ps1"
$scriptBlock = {
    try {
        & $Using:scriptPath
    }
    catch {
        Write-Host "Error occurred on $($env:COMPUTERNAME): $_"
    }
}
$computers | ForEach-Object -Parallel {
    Invoke-Command -ScriptBlock $scriptBlock -ComputerName $_
}

私はジョブズに留まり、ログを取得することを絶対にお勧めしますReceive-Job

関連情報