Обработка данных, возвращенных из Invoke-Command, по мере их получения?

У меня есть сценарий PowerShell, который я хочу запустить на более чем 5000 конечных точках. Сценарий перечисляет кучу информации о каждом хосте, которую я затем хочу передать в другую программу для анализа.

Проблема, с которой я сталкиваюсь, заключается в том, что Invoke-Command не позволяет мне обрабатывать данные, возвращаемые с каждой машины, по мере их получения. Это проблема, потому что с более чем 5000 конечных точек я сталкиваюсь с ограничениями памяти на машине, с которой я запускаю Invoke-Command.

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

$ProcessOutput = {
    # $_ = Data returned from one machine    
    $_ | Out-File ($_.PSComputerName)
}

Invoke-Command -FilePath $ScriptPath -ComputerName $Computers -ProcessingScriptBlock $ProcessOutput

Это уже возможно, и я что-то упускаю из виду? Или лучше всего просто разделить список компьютеров на части и сканировать каждую часть по одному (что приводит к увеличению времени выполнения)?


person tifkin    schedule 09.05.2016    source источник


Ответы (1)


Вы можете использовать задания, foreach -parallel (в рабочем процессе) или пространства выполнения (быстрее, но сложнее, чем задания) для запуска параллельных рабочих нагрузок. Вот пример с использованием заданий, который легче всего читать.

$ProcessOutput = {
    # $_ = Data returned from one machine    
    $_ | Out-File "$($_.PSComputerName).txt"
}

$Computers = "localhost", "frode-pc"

#Start job
$mainjob = Invoke-Command -FilePath $ScriptPath -ComputerName $Computers -AsJob

#Process results as they complete
while ($mainjob.State -eq "Running") {
    $mainjob.ChildJobs | Where-Object { $_.State -eq 'Completed' } | Receive-Job | ForEach-Object $ProcessOutput
}

#Process last job(s)
$mainjob.ChildJobs | Where-Object { $_.State -eq 'Completed' } | Receive-Job | ForEach-Object $ProcessOutput

Если производительность критична, используйте пространства выполнения. Ознакомьтесь с Invoke-Parallel для простой в использовании реализации пространств выполнения.

person Frode F.    schedule 09.05.2016
comment
Boe Prox создал отличный модуль под названием PoshRSJob, который позволяет использовать пространства выполнения аналогично PSJob, но даже лучше. - person briantist; 10.05.2016
comment
Проверим. В мой ответ добавлено Invoke-Parallel в качестве решения для запуска. Я обычно делаю это вручную с помощью моих собственных самодельных шаблонов сценариев для пространств выполнения (у меня есть пара, использующая разные системы тайм-аута) :-) - person Frode F.; 10.05.2016