运行 一个 gridview 输出的多个测试连接

Run multiple test-connection for one gridview output

如何使用多个 Test-Connection cmdlet 并将它们全部放在一个 Out-GridView 中,或者对于我在这里尝试做的事情是否有其他解决方案? 关键是能够一个接一个地 ping 多个地址,并让它们全部出现在同一个 window.

你可以使用这个命令:

$tests=  Test-Connection -ComputerName $env:COMPUTERNAME
$tests+= Test-Connection -ComputerName $env:COMPUTERNAME
$tests| Out-GridView

将您的 IP 地址(或主机名)列表输入 ForEach-Object 循环 运行ning Test-Connection 每个地址,然后将结果输入 Out-GridView

$addr = '192.168.1.13', '192.168.23.42', ...
$addr | ForEach-Object {
  Test-Connection $_
} | Out-GridView

请注意,这可能相当 time-consuming,具体取决于您要检查的地址数量,因为所有地址都是按顺序检查的。

如果您需要加快处理大量地址的速度,例如,您可以 运行 并行检查 background jobs:

$addr | ForEach-Object {
  Start-Job -ScriptBlock { Test-Connection $args[0] } -ArgumentList $_
} | Out-Null

$results = do {
  $running   = Get-Job -State Running
  Get-Job -State Completed | ForEach-Object {
    Receive-Job -Job $_
    Remove-Job -Job $_
  }
} while ($running)

$results | Out-GridView

不过,过多的并行性可能会耗尽您的系统资源。根据您要检查的地址数量,您可能需要在 运行 按顺序排列事物和 运行 并行排列事物之间找到一些中间地带,例如使用 job queue.

Test-Connection 可以获取一组计算机名称或地址并对它们执行 ping 操作。每台计算机上的每个 ping 都会 return 一行,但您可以使用 -Count 参数将其限制为 1 次 ping。您还可以使用 -AsJob 到 运行 命令作为后台作业。

$names = server1,server2,serverN
Test-Connection -ComputerName $names -Count 1 -AsJob | Wait-Job | Receive-Job

您将得到 Win32_PingStatus 个对象的列表,这些对象显示为

Source        Destination     IPV4Address      IPV6Address     Bytes    Time(ms) 
------        -----------     -----------      -----------     -----    -------- 

如果时间栏(ResponseTime 属性)为空,则没有ping重播,服务器离线。你可以过滤这个。