2013-05-17 67 views
0

嗨,大家好,即時通訊問題讓我頭腦發熱,如何才能捕獲ping變量的響應。因爲我想能夠輸出回到csv與響應。當然,我有一個非常好的機會來完全錯誤地接近它!Powershell捕獲循環輸出到變量

$PingMachines=import-Csv -path C:\temp\pcs.csv -Header cn,operatingsystem,LastLogonDate 

foreach ($pc in $pingmachines.cn) { 
    $PingStatus = Gwmi Win32_PingStatus -Filter "Address = '$pc'" | ` 
    Select-Object StatusCode 

    If ($PingStatus.StatusCode -eq 0){ 
     Write-Host $pc "up" 
    }  
    Else { 
     Write-Host $pc "down" 
    } 
} 

在一個理想的世界ID喜歡能夠保存輸出,即PC,pingstatus.statuscode回變量,但IM與邏輯掙扎,如何以遞增到變量,而不是僅僅有最後目標。

在此先感謝。

回答

0

我重寫了一下你的代碼;這個工作對我來說:

$machines = import-csv -path machines.csv -header ip,os,LastLogonDate 

foreach ($machine in $machines) 
{ 
    $ip = $machine.ip 
    $status = gwmi win32_PingStatus -filter "Address = '$ip'" 

    if ($status.StatusCode -eq 0) 
    { Write-Host $ip 'up' } 
    else 
    { Write-Host $ip 'down' } 
} 

我測試了它在文件上machines.csv看起來像這樣:

"127.0.0.1","linux","2012-1-1" 
"192.168.1.93","minux","2012-2-10" 
"192.168.1.254","xenix","2012-3-20" 
"192.168.1.66","dynix","2012-4-5" 

當我運行它時,輸出看起來是這樣的:

PS C:\Users\dharmatech\Documents> C:\Users\dharmatech\Documents\check-machine-status.ps1 
127.0.0.1 up 
192.168.1.93 up 
192.168.1.254 up 
192.168.1.66 up 
0

使用Win32_PingStatus WMI對象,因爲它已包含您需要的數據。當您將gwmi結果傳遞給Select-Object時,將刪除StatusCode以外的所有內容。

考慮

$PingStatus = Gwmi Win32_PingStatus -Filter "Address = '$pc'" | Select-Object StatusCode 
$PingStatus # Contains only StatusCode 

輸出:

StatusCode 
---------- 
0 

儘管WMI類包含多個成員:

$PingStatus = Gwmi Win32_PingStatus -Filter "Address = '$pc'" 
$PingStatus # Contains a lot more 

輸出:

Source Destination IPV4Address IPV6Address Bytes Time(ms) 
------ ----------- ----------- ----------- ----- -------- 
MyPC Server  10.0.0.1  {}   32  1 
0

使用ForEach-Object而不是foreach(in)構造的流水線。使用ForEach-Object將運行命令作爲管道的一部分,這將允許您將輸出捕獲爲變量。

$PingMachines=import-Csv -path C:\temp\pcs.csv -Header cn,operatingsystem,LastLogonDate 

$PingMachines.cn | ForEach-Object { 
    $PingStatus = Gwmi Win32_PingStatus -Filter "Address = '$_'" | ` 
    Select-Object StatusCode 

    If ($PingStatus.StatusCode -eq 0){ 
    Write-Host $_ "up" 
    }  
    Else { 
     Write-Host $_ "down" 
    } 
} 

你能想到的管線版本的$ _自動變量是這樣的:

foreach($_ in $PingMachines.cn) { 
    #code that uses $_ 
} 

一旦你有一個管道去,你需要輸出的對象,而不是隻打印到屏幕使用Write-主持人:

$PingMachines=import-Csv -path C:\temp\pcs.csv -Header cn,operatingsystem,LastLogonDate 

$PingResults = $PingMachines.cn | ForEach-Object { 
    $PingStatus = Gwmi Win32_PingStatus -Filter "Address = '$_'" | ` 
    Select-Object StatusCode,Address 
    #I added the Address property above so you would have the machine name in the output object 

    If ($PingStatus.StatusCode -eq 0){ 
    Write-Host $_ "up" 
    }  
    Else { 
     Write-Host $_ "down" 
    } 

    #Send the $PingStatus object out on the pipeline, which will end up in $PingResults 
    Write-Output $PingStatus 
} 

月攪拌機最近發表了一篇很好的文章powershell.org覆蓋輸出對象VS寫主機和創建自定義對象,因此我這裏不會詳細介紹。