2

Время от времени мне нужно запускать команды на нескольких серверах Windows (синхронизировать файлы из репозитория исходного кода, содержащего файлы сценариев [и другие случайные вещи]). Время выполнения этой команды определяется задержкой в сети.

В настоящее время я использую командлет PowerShell Invoke-Command, но он запускает команду последовательно на каждом хосте. Поскольку запуск этого сценария занимает приятное время (иногда пару минут на сервер), я бы хотел ускорить процесс, выполнив команду параллельно на всех серверах одновременно.

Invoke-Command, насколько я мог понять, не может этого сделать. Psexec от SysInternals тоже не может этого сделать.

Я смутно осознаю, что PowerShell имеет средство параллельного цикла, которое может выполнять несколько итераций цикла одновременно в нескольких потоках. Но в документации говорится, что это доступно только в рабочем процессе PowerShell, с которым я не знаком, и это звучит так, как будто это слишком много.

В оболочке Unix-y я мог запускать каждый вызов psexec в фоновом режиме. Но, насколько мне известно, PowerShell не поддерживает это. Или я мог бы использовать инструмент, как GNU Parallels или TS.

Есть ли (простой) способ сделать это на компьютере с Windows 7?

Если ничего не помогает, я мог бы написать Perl-Script или что-то еще, но зачем изобретать велосипед? Конечно, я не первый человек, который столкнется с этой проблемой.

1 ответ1

5

Вы можете использовать задания Powershell для параллельного запуска нескольких команд Invoke. Как именно это работает, уже было объяснено в переполнении стека: https://stackoverflow.com/questions/8781666/run-n-parallel-jobs-in-powershell

Я копирую его сюда для справки, слегка адаптировав к вашему случаю

Командлет Start-Job позволяет запускать код в фоновом режиме.

foreach ($server in $servers) {
    $running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
    if ($running.Count -le 8) {
        Start-Job {
             $list = Invoke-Command -FilePath .\file.ps1 -ComputerName <hostname>
             ...
        }
    } else {
         $running | Wait-Job
    }
    Get-Job | Receive-Job
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .