2013-05-03 38 views
6

Có cách nào để chạy dưới đây để chạy song song (đa luồng) không? Tôi có khoảng 200 máy chủ cần chạy và đang tự hỏi liệu có cách nào kiểm tra 10 máy chủ cùng một lúc chứ không phải từng lần một ... WMI rất chậm trong việc kiểm tra cái này cùng một lúc.Làm cách nào để thêm đa luồng?

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

Trả lời

8

việc Sử dụng 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

nếu bạn muốn được nâng cao hơn với đề kiểm soát thử này [link] (http://blogs.msdn.com/b/powershell/archive/2011 /04/04/scaling-and-queuing-powershell-background-jobs.aspx) – jbockle

+0

cảm ơn rất nhiều !!!! Đây là SOOOOO NHANH NGAY BÂY GIỜ !!! Cảm ơn rất nhiều vì chuyện này. – lara400

+3

fyi cho những người không biết lệnh ForEach-Object có bí danh% và foreach. Ngoài ra $ _ về cơ bản có nghĩa là đối tượng này. Nó hoạt động rất giống với dòng 'foreach ($ server trong $ servers)' ngoại trừ mã jbockle vòng lặp foreach chỉ là bắt đầu công việc (tất cả 200ish) và không thực hiện xử lý bên trong vòng lặp 1 của 1. – BeowulfNode42