Как запустить скрипт 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

Я думаю, у вас есть три варианта:

  • Продолжайте работу, но немного реорганизуйте свой код
  • Использование ForEach-Object -Parallelв PowerShell 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 $_
}

Я бы настоятельно рекомендовал вам оставаться с Jobs и получать ваши журналы черезReceive-Job

Связанный контент