2013-05-03 90 views
6

有沒有辦法讓下面的並行運行(多線程)?我有大約200臺服務器需要運行,並且想知道是否有一種方法可以一次檢查10臺服務器,而不是每次只檢測一臺服務器...... WMI一次檢查這個服務器的速度非常慢。如何添加多線程?

clear 
Write-Host "Script to Check if Server is Alive and Simple WMI Check" 

$servers = Get-Content -Path c:\Temp\Servers.txt 

foreach($server in $servers) 
{ 
    if (Test-Connection -ComputerName $server -Quiet) 
    { 
    $wmi = (Get-WmiObject -Class Win32_ComputerSystem -ComputerName $server).Name 

    Write-Host "$server responds: WMI reports the name is: $wmi" 
    } 

    else 
    { 
    Write-Host "***$server ERROR - Not responding***" 
    } 
} 

回答

8

使用PowerShell工作:

$scriptblock = { 
    Param($server) 
    IF (Test-Connection $server -Quiet){ 
     $wmi = (gwmi win32_computersystem -ComputerName $server).Name 
     Write-Host "***$server responds: WMI reports the name is: $wmi" 
    } ELSE { Write-Host "***$server ERROR -Not responding***" } 
} 
$servers | % {Start-Job -Scriptblock $scriptblock -ArgumentList $_ | Out-Null} 
Get-Job | Wait-Job | Receive-Job 
如果你想獲得與控制線程更先進
+1

試試這個[鏈接](http://blogs.msdn.com/b/powershell/archive/2011 /04/04/scaling-and-queuing-powershell-background-jobs.aspx) – jbockle 2013-05-03 13:41:52

+0

非常感謝!!!!這是SOOOOO快速!非常感謝。 – lara400 2013-05-03 14:00:26

+3

fyi對於那些不知道命令的人,ForEach-Object具有別名%和foreach。 $ _本質上也是指這個對象。它與'foreach($ server在$ servers中)'行非常相似,除了在jbockle的代碼中,foreach循環只是開始工作(全部爲200個),而不是在循環1內進行處理。 – BeowulfNode42 2013-11-25 07:29:35