2013-05-17 61 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写主机和创建自定义对象,因此我这里不会详细介绍。