Запуск одновременных функций для автоматизации исправлений с PowerShell - PullRequest
0 голосов
/ 18 января 2020

Я видел другой пост, касающийся параллельного запуска или одновременного запуска функций, но код в ответах мне не совсем помог. Я занимаюсь автоматизацией исправлений и всеми функциями, которые у меня есть, и делаю свое дело по отдельности, но поскольку мы работаем с более чем 200 компьютерами, я жду, пока каждая функция завершит работу sh, поскольку ее серия компьютеров как бы не справляется с задачей. У меня есть код в одном скрипте и в итоге его структура выглядит следующим образом:

определить глобальные переменные

$ global: varN

определить подфункции

функция sub-function1 ()

функция sub-functionN ()

определяет основные функции

функция InstallGoogleFunction ($ global: varN) {

$ var1

$ result1 = подфункция1

$ resultN = подфункцияN

}

функция InstallVLCFunction ($ global: varN) {

"код, аналогичный приведенному выше"

}

функция InstallAppFunction ($ global: varN) {

"код, аналогичный указанному выше"

}

Все функции установят другое приложение / программное обеспечение и запишут вывод в файл. Единственное, что я не могу запустить все функции для установки, не дожидаясь окончания первой из них sh. Я пробовал код запуска задания, но он выполнялся и отображал таблицу, похожую на вывод, но при проверке компьютеров ни один из них не работал в диспетчере задач. Есть ли способ, чтобы powershell мог запустить эту функцию установки одновременно? Если мне придется прибегнуть к помощи один за другим, я буду вызывать функции по наименьшему количеству затраченного времени или по наименьшему количеству компьютеров, которые нужно установить для чтения функций, которые я буду устанавливать, но я просто хотел, чтобы кто-то лучше объяснил, можно ли это сделать. .

1 Ответ

0 голосов
/ 18 января 2020

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

Замените список машин в $Computers на свои машины и попробуйте. Ниже приведен пример получения информации о диске на указанных машинах

# This is your script you want to execute
$wmidiskblock = 
{ 
  Param($ComputerName = "LocalHost") 
  Get-WmiObject -ComputerName $ComputerName -Class win32_logicaldisk |  Where-Object {$_.drivetype -eq 3} 
} 

# List of servers
$Computers = @("Machine1", "Machine2", "Machine3")  

#Start all jobs in parallel 
ForEach($Computer in $Computers) 
{ 
   Write-Host $Computer 
   Start-Job -scriptblock $wmidiskblock  -ArgumentList $Computer 
} 

Get-Job | Wait-Job 

$out = Get-Job | Receive-Job 
$out |export-csv 'c:\temp\wmi.csv'
...