2013-05-03 3 views
6

C'è un modo per far funzionare il sotto in parallelo (multi-threading)? Ho circa 200 server che devono essere eseguiti e mi chiedevo se c'è un modo per controllare dire 10 server contemporaneamente piuttosto che uno alla volta ... WMI è molto lento nel controllarlo uno alla volta.Come si aggiunge il multi-threading?

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

risposta

8

posti di lavoro Usa 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

se si vuole ottenere più avanzato con le discussioni che controllano provare questo [link] (http://blogs.msdn.com/b/powershell/archive/2011 /04/04/scaling-and-queuing-powershell-background-jobs.aspx) – jbockle

+0

grazie mille !!!! Questo è SOOOOO RAPIDO ORA !!! Grazie mille per questo. – lara400

+3

fyi per coloro che non conoscono il comando ForEach-Object ha alias% e foreach. Anche $ _ significa essenzialmente questo oggetto. Funziona in modo molto simile alla riga 'foreach ($ server in $ server)' tranne nel codice di jbockle il ciclo foreach sta appena iniziando i job (tutti i 200ish) e non sta eseguendo l'elaborazione all'interno del ciclo 1 per 1. – BeowulfNode42