Запускать несколько тестовых подключений для одного вывода gridview

Как я могу использовать несколько Test-Connection командлеты и положить их все в одном Out-GridView, или есть другое решение того, что я пытаюсь сделать здесь? Суть в том, чтобы иметь возможность пинговать несколько адресов друг за другом и отображать их в одном окне.

3 ответа

Решение

Подайте ваш список IP-адресов (или имен хостов) в ForEach-Object цикл работает Test-Connection для каждого адреса, затем передайте результат в Out-GridView:

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

Обратите внимание, что это может занять довольно много времени, в зависимости от количества проверяемых адресов, поскольку все они проверяются последовательно.

Если вам нужно ускорить обработку большого количества адресов, вы можете, например, запустить проверки как параллельные фоновые задания:

$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

Однако слишком большой параллелизм может исчерпать ваши системные ресурсы. В зависимости от того, сколько адресов вы хотите проверить, вам может потребоваться найти некоторую золотую середину между последовательным запуском и параллельным выполнением, например, с помощью очереди заданий.

Вы можете использовать эту команду:

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

Test-Connection может взять массив имен компьютеров или адресов и пропинговать их. Он вернет строку для каждого пинга на каждом компьютере, но вы можете использовать -Count параметр, чтобы ограничить его до 1 пинга. Вы также можете использовать -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) пуст, воспроизведение пинга отсутствует, сервер отключен. Вы можете отфильтровать это.

Другие вопросы по тегам