使用PowerShell在多个服务器上运行病毒扫描

时间:2013-08-12 16:56:00

标签: powershell

我正在尝试在我们环境中的服务器列表上运行病毒扫描。有数百台机器,所以我们希望一次大约10个运行扫描(使用我们已有的命令行提示符)。我们对PowerShell来说是全新的,所以任何帮助都会非常感激。我们对我们需要使用哪些命令有一个大概的了解 - 这就是我们现在认为它可能起作用的方式:

$server = Get-Content "serverlist.txt"
$server | % {
  $VirusScan = { Scan32.exe }
  Invoke-Command -ScriptBlock { $VirusScan } -computerName $server -ThrottleLimit 10 -Authentication domain/admin 
}

有没有人对我们如何协调这个有任何建议?

1 个答案:

答案 0 :(得分:6)

我正在使用类似的东西在远程主机上并行运行任务:

$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
}