2013-05-03 25 views
6

Gibt es eine Möglichkeit, die Unterseite parallel laufen zu lassen (Multithreading)? Ich habe ungefähr 200 Server, die ausgeführt werden müssen, und ich frage mich, ob es eine Möglichkeit gibt, 10 Server gleichzeitig und nicht einzeln nacheinander zu überprüfen ... WMI ist sehr langsam dabei, dies einzeln zu überprüfen.Wie füge ich Multithreading hinzu?

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***" 
    } 
} 

Antwort

8

Verwenden von Powershell Jobs:

$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

wenn Sie wollen weiter fortgeschritten mit der Steuerung Fäden erhalten versuchen, diese [link] (http://blogs.msdn.com/b/powershell/archive/2011 /04/04/scaling-and-queuing-powershell-background-jobs.aspx) – jbockle

+0

danke viel !!!! Das ist SOOOOO SCHNELL JETZT !!! Vielen Dank dafür. – lara400

+3

fyi für diejenigen, die den Befehl nicht kennen. ForEach-Object hat Aliase% und foreach. Auch bedeutet das $ _ im Wesentlichen dieses Objekt. Es funktioniert sehr ähnlich wie die Zeile 'foreach ($ server in $ servers)' außer in jbockles Code startet die foreach-Schleife gerade Jobs (alle 200ish) und macht die Verarbeitung innerhalb der Schleife nicht 1. – BeowulfNode42

Verwandte Themen