2016-04-24 16 views
1

WMIクエリを使用してWindowsサーバから数値Multipathを見つける小さなスクリプトを作成しました。それは問題なく直接接続できるサーバーでうまく動作します。しかし、1つのサーバがping可能でWMIスクリプトを経由することができない場合は、エラーを返すのに時間がかかります(たとえば、Linuxサーバのホスト名がservers.txtリストにある場合など)。より速い方法で..?PowershellからWMIクエリを実行する方法はありますか?

$Servers = Get-Content .\Servers.txt 

$ErrorActionPreference = ‘SilentlyContinue’ 

FOREACH ($Server in $Servers) { 

Write-Host $Server -nonewline 

if (test-connection -computername $Server -Count 1 -quiet) { 

$Name = $null 
$NoPath =$null 
$MPIODisks =$null 

$MPIODisks = Get-WmiObject -Namespace root\wmi -Class mpio_disk_info -ComputerName "$Server" |Select-Object "DriveInfo" 

    if ($MPIODisks -eq $Null) { 

    write-host "`t - Unable to connect" -fore "RED" 

    } else {  

     write-host "" 
     write-host "Drive Name `tNo.Path" -fore "yellow" 

      Foreach ($Disk in $MPIODisks) { 
       $mpiodrives = $disk.DriveInfo 

        foreach ($Drive in $mpiodrives) { 
       $Name = $Drive.Name 
       $NoPath = $Drive.Numberpaths 

        If ($NoPath -lt 4) { 
        Write-Host $Name `t -nonewline 
        write-host $NoPath -fore "Red" 
        } else { 
        Write-Host $Name `t -nonewline 
        write-host $NoPath -fore "Green" 
        } 
        } 
      } 

    } 

    write-host "" 

} else { 

write-host "`t- Unknown Host" -fore "Red" 
write-host "" 
} 

}

+0

使用しているのPowerShellのバージョンを? –

+0

新しいバージョンでは、 'Get-CimInstance -OperationTimeoutSec' –

答えて

3

a connect item for Get-WmiObject to add a timeout parameterがあります。その項目に記載されている回避策は、WMIコマンドをWait-Jobにパイプし、タイムアウト時間を秒単位で指定することです。限り、あなたのPSのバージョン3.0以降で、これはあなたのために働く必要があるとして

:別の方法として

Get-WmiObject win32_computersystem -ComputerName <hostname> -AsJob | Wait-Job -Timeout 10 | Receive-Job 
2

、クエリにそれらのすべてを渡すことで、一度に結果のためのすべてのサーバーを求めることができるし、遅いループが一度に1つのサーバーに問い合わせるのを避けます。私は、MPIOがでテストするドライブ任意の必要はありませんが、それはこのような何か(タイムアウトパラメータ取りGet-Ciminstance使用)になります:あなたのクライアントとサーバー上で

$servers = Get-Content .\Servers.txt 

# Get data from all servers with timeout 
$servers_ok = Get-CimInstance -computername $servers -Namespace root\wmi -Class mpio_disk_info -ErrorAction SilentlyContinue -OperationTimeoutSec 1 | group pscomputername 

# Output which servers gave no result back 
foreach($no_result in $($servers | where { $_ -NotIn $servers_ok.Name })) { 
    write-host "No result for $no_result" -ForegroundColor Red 
} 

# Loop over the results and output 
foreach($server in $servers_ok) { 

    Write-Host $server.Name 

    foreach($mpiodisk in $server.group)  { 

     $mpiodrives = $mpiodisk.DriveInfo 

     foreach ($mpiodrive in $mpiodrives) { 

      $name = $mpiodrive.Name 
      $noPath = $mpiodrive.NumberPaths 

      If ($NoPath -lt 4) { 
       write-host $name `t -nonewline 
       write-host $noPath -fore "Red" 
      } else { 
       write-host $name `t -nonewline 
       write-host $noPath -fore "Green" 
      } 
     } 
    } 
} 
関連する問題