2013-05-03 4 views
6

以下をパラレルに実行する方法はありますか(マルチスレッド)?私は実行する必要がある約200台のサーバーがあり、一度に1台ではなく10台のサーバーをチェックする方法があるかどうか疑問に思っていました... WMIは一度に1台ずつチェックするのが非常に遅いです。マルチスレッドを追加するにはどうすればよいですか?

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

+0

ありがとうたくさん!!!!これはSOOOOO QUICK NOW !!!これは本当にありがとう。 – lara400

+3

コマンドForEach-Objectを知らない人のためのfyiは、エイリアス%とforeachを持っています。また、$ _は基本的にこのオブジェクトを意味します。これは、foreachループがちょうどジョブ(すべて200ish)を開始しており、ループ内で処理を行わないことを除いて、 'foreach($ server in $ servers)'行と非常によく似ています。 – BeowulfNode42

関連する問題