0

大家好,如果有意义的话,我在如何捕获对变量的 ping 响应时遇到问题。因为我希望能够将响应输出回 csv。当然,我很有可能以完全错误的方式处理这个问题!

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

在一个理想的世界中,我喜欢能够将输出(即 pc,pingstatus.statuscode)保存回一个变量,但我正在努力解决逻辑以及如何增加变量而不是仅仅拥有最后一个对象。

提前致谢。

4

3 回答 3

0

使用Win32_PingStatusWMI 对象,因为它已经包含您需要的数据。当您将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
于 2013-05-17T04:57:46.380 回答
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-Host 打印到屏幕上:

$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
}

June Blender 最近在powershell.org上发表了一篇很好的文章,其中涵盖了输出对象与 Write-Host 以及创建自定义对象,所以我不会在这里详细介绍。

于 2013-05-18T06:26:09.793 回答
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
于 2013-05-17T04:50:52.610 回答