MultiPing.ps1

Думаю многим приходилось запускать несколько окошек с ping –t в которых пинговались разные серверы. Я решил немножко оптимизировать сей процесс, и написал вот этот простой скриптик🙂 Он принимает на вход массив имён серверов, и еще можно указать количество пингов на каждый (по умолчанию – бесконечно).

Следующий код помещаем в файл MultiPing.ps1:

#Объявляем параметры и их значения по умолчанию
param ([string[]]$Servers, [int]$Count=-1, $Timeout=1)
#Создаём объект $pinger, который и будет делать всё самое главное :)
$pinger = New-Object system.net.networkinformation.ping
#Устанавливаем поведение при ошибке - продолжать и не выводить ошибку на экран
$ErrorActionPreference = "SilentlyContinue"
#Выполняем следующий цикл указанное кол-во раз, или бесконечно если $Count 
#равен -1 (по умолчанию)
for ($n=0; $n -lt $Count -or $Count -eq -1; $n++)
{
    #Создаём пустой объект
    $Obj = new-object psobject
    #Добавляем к нему свойство с именем Time и значением равным текущему времени
    $Obj | add-member -type noteproperty -name "Time" -value (get-date -format "hh:mm:ss")
    #Для каждого сервера в массиве $Servers...
    foreach ($Server in $Servers)
    {
        #Обрабатываем ошибку
        trap {$Obj | add-member -type noteproperty -name $Server -value "Error"}
        #Посылаем ping, и сохраняем результат в переменной $res
        $res = $pinger.Send($Server,($Timeout*1000))
        #Если пинг успешен, то
        if ($res.Status -eq "Success")
        {
            #Устанавливаем значение равным времени отклика
            $Value = $res.RoundtripTime
        }
        else
        {
            #Иначе - указываем в значении статус
            $Value = $res.status
        }
        #Добавляем свойство с именем сервера, и значением
        $Obj | add-member -type noteproperty -name $Server -value $Value
    }
    #Выводим результирующий объект
    $Obj
}

И запускаем:

multiping

Обратите внимание, что если указано больше трёх серверов, то нужно перенаправить вывод в Format-Table (или ft), так как PowerShell по умолчанию выводит объекты с 5ю и более свойствами в виде списка свойств, а в данном случае это не слишком красиво.

Опубликовано в PowerShell, Scripting, Tips. Метки: , . 5 комментариев »

комментариев 5 to “MultiPing.ps1”

  1. zorion Says:

    а я себе добавил как set-multiping🙂

  2. Clevelus Says:

    Мде. Василий, вот сколько смотрю, подобоные вещи, все-таки, удобнее написать на том же C#: кода столько же, результат может быть гораздо лучше и легко модифицируется …
    С другой стороны если собрать в одну библиотеку, то использовать конечно удобно … но вот запомнить все команды, если редко используешь …

  3. Xaegr Says:

    2 Clevelus: Ну кода тут однозначно меньше чем в c#.
    Результат… если писать на c# командлет для PowerShell — будет такой же, да. Если отдельную утилиту — будет сильно отставать от командлета/скрипта по множеству возможностей которые даёт движок — PowerShell.
    Ну и модифицировать скрипт однозначно проще чем код, даже если это c#🙂
    Что однозначно проще делать на C# (пока😉 ), на нём и делаем, например https://xaegr.wordpress.com/2009/02/11/powershell1-api/🙂 Еще иногда можно использовать c# код в блоках где крайне важна производительность.
    Если правильно называть командлеты/скрипты, то запоминать не сильно то и нужно. Verb-Noun форма очень способствует быстрому нахождению нужного инструмента. В данном случае я просто не заморачивался придумыванием названия, так как это ad-hoc скрипт, который я написал буквально за 10-15 минут🙂

  4. Andrey Vakhitov Says:

    У меня скрипт выполнялся чаще раза в секунду. Поэтому добавил командлет Start-Sleep.😉

  5. Andrey Vakhitov Says:

    Я тестировал скрипт в локальной сети.

    Прошу прощения, что не поместил в старый коммент — тайм-ауты в локальной сети некорректно обрабатываются, пропуская сразу несколько секунд…
    Нужно распараллелить выполнение, а это не очень красиво на PS будет смотреться (мне кажется :)…


Обсуждение закрыто.

%d такие блоггеры, как: