Используйте PowerShell для запуска проверки на вирусы на нескольких серверах
Я пытаюсь запустить проверку на вирусы в списке серверов в нашей среде. Существуют сотни машин, поэтому мы хотели бы запускать сканирование (используя приглашение командной строки, которое у нас уже есть) примерно по 10 за раз. Мы совершенно новички в PowerShell, поэтому любая помощь будет принята с благодарностью. У нас есть общее представление о том, какие команды нам нужно использовать - вот как мы думаем, что это может работать на данный момент:
$server = Get-Content "serverlist.txt"
$server | % {
$VirusScan = { Scan32.exe }
Invoke-Command -ScriptBlock { $VirusScan } -computerName $server -ThrottleLimit 10 -Authentication domain/admin
}
У кого-нибудь есть предложения о том, как мы могли бы организовать это?
1 ответ
Решение
Я использую что-то вроде этого для параллельного запуска задач на удаленных хостах:
$maxSlots = 10
$hosts = "foo", "bar", "baz", ...
$job = {
Invoke-Command -ScriptBlock { Scan32.exe } -Computer $ARGV[0] -ThrottleLimit 10 -Authentication domain/admin
}
$queue = [System.Collections.Queue]::Synchronized((New-Object System.Collections.Queue))
$hosts | ForEach-Object { $queue.Enqueue($_) }
while ( $queue.Count -gt 0 -or @(Get-Job -State Running).Count -gt 0 ) {
$freeSlots = $maxSlots - @(Get-Job -State Running).Count
for ( $i = $freeSlots; $i -gt 0 -and $queue.Count -gt 0; $i-- ) {
Start-Job -ScriptBlock $job -ArgumentList $queue.Dequeue() | Out-Null
}
Get-Job -State Completed | ForEach-Object {
Receive-Job -Id $_.Id
Remove-Job -Id $_.Id
}
Sleep -Milliseconds 100
}
# Remove all remaining jobs.
Get-Job | ForEach-Object {
Receive-Job -Id $_.Id
Remove-Job -Id $_.Id
}