Ping-сервер и вывод на основе того, как долго пинг

Вы можете сделать это без петли:

df.2 <- melt(df)
gg <- ggplot(df.2, aes(x=topic, y=value))
gg <- gg + geom_violin(position="identity", aes(color=variable), alpha=0.3)
gg

enter image description here [/g0]

1
задан peterbonar 13 July 2018 в 14:09
поделиться

3 ответа

Следующий сценарий использует Test-Connection с -Count 1 и настраиваемый Delay между тестами, а также treshold для определения Success / Timeout.

## Q:\Test\2018\07\13\SO_51327101.ps1

$Servers = "8.8.8.8","8.8.4.4","62.220.18.8","89.246.64.8" 

$TimeStart = Get-Date
$TimeEnd = $TimeStart.AddMinutes(2)

$Treshold = 12
$DelayMS = 1500

Do {
    Foreach($Server in $Servers) {
        $Response = Test-Connection $Server -Count 1
        $Status = 'Success '
        If ($Response.ResponseTime -gt $Treshold){$Status = 'TimedOut'}
        "[{0}] {1} Server: {2,15} Responsetime: {3,3} ms" -f `
            (Get-Date -f yyyyMMddHHmmss),
            $Status,
            $Server,
            $Response.ResponseTime
    }
    Start-Sleep -Milliseconds $DelayMS
} Until ((Get-Date) -ge $TimeEnd)

Выходной сигнал образца

[20180713172651] TimedOut Server:     89.246.64.8 Responsetime:  13 ms
[20180713172653] Success  Server:         8.8.8.8 Responsetime:  12 ms
[20180713172653] Success  Server:         8.8.4.4 Responsetime:  12 ms
[20180713172653] Success  Server:     62.220.18.8 Responsetime:   7 ms
[20180713172653] TimedOut Server:     89.246.64.8 Responsetime:  13 ms
1
ответ дан LotPings 17 August 2018 в 12:39
поделиться
  • 1
    Это отлично работает :) есть ли способ вывести это в файл в конце? – peterbonar 16 July 2018 в 10:19
  • 2
    Просто перенаправить вывод в файл, добавляющий >> '.\file.log или pipe в Out-File '.\file.log' -Append -Encoding ascii – LotPings 16 July 2018 в 11:02

Этот метод использует Workflow для параллельного пинга. Он также учитывает, что тайм-аут System.Net.NetworkInformation.Ping не является точным, когда дело доходит до использования в миллисекундах. Я предлагаю работать с Boxzogs Answer, так как он является самым встроенным в стандарты powershell. Но я хотел присоединиться к веселью и обучению.

workflow AdvPing([string[]]$Servers, [timespan]$RunTimeLength, [timespan]$Freqency, [timespan]$PingTimeout){
    foreach -parallel ($Server in $Servers)
    {
        $Runtime = (get-date).Add($RunTimeLength)
        $CurrentDate = get-date
        $Timeout = $PingTimeout
        $Ping = New-Object System.Net.NetworkInformation.Ping

        while($CurrentDate -le $RunTime){
            $Response = ""
            $ResponseMessage = ""
            $CurrentFreqency = (Get-Date).add($Freqency)
            try{
                $Response = $Ping.Send($Server,$Timeout.TotalMilliseconds)
                if(($Response.RoundtripTime -gt $PingTimeout.Milliseconds) -and ($Response.Status -like "Success")){
                    $ResponseMessage = "TimeOut"
                }else{
                    $ResponseMessage = $Response.Status
                }
                $Reply = New-Object psobject -Property @{
                    Server = $Server
                    Response = $ResponseMessage
                    Date = $(get-date).DateTime
                    Time = $Response.RoundtripTime
                    Exception = $null
                }
            }catch{
                $Reply = New-Object psobject -Property @{
                    Server = $Server
                    Response = "No Host"
                    Date = $(get-date).DateTime
                    Time = $null
                    Exception = $_
                }
            }
            $Reply

            $CurrentDate = Get-Date
            [timespan]$Wait = $CurrentFreqency - $CurrentDate
            try{
                sleep -Milliseconds $Wait.TotalMilliseconds
            }catch{}
        }
    }
}

$Servers = @("8.8.8.8", "8.8.4.4", "StackOverflow.com","243.42.432.44")
advping -Servers $Servers -RunTimeLength ([TimeSpan]::FromSeconds(60)) -Freqency ([TimeSpan]::FromSeconds(1)) -PingTimeout ([TimeSpan]::FromMilliseconds(5)) | format-table Date,Server,Response,Time

Выход будет выглядеть как

Date                             Server            Response Time
----                             ------            -------- ----
Friday, July 13, 2018 2:53:37 PM 243.42.432.44     No Host      
Friday, July 13, 2018 2:53:37 PM StackOverflow.com TimeOut  15  
Friday, July 13, 2018 2:53:37 PM 8.8.4.4           Success  2   
Friday, July 13, 2018 2:53:37 PM 8.8.8.8           Success  2   
Friday, July 13, 2018 2:53:38 PM 243.42.432.44     No Host      
Friday, July 13, 2018 2:53:38 PM StackOverflow.com TimeOut  15  
Friday, July 13, 2018 2:53:38 PM 8.8.4.4           Success  2   
Friday, July 13, 2018 2:53:38 PM 8.8.8.8           Success  2   
0
ответ дан ArcSet 17 August 2018 в 12:39
поделиться

Вы можете использовать Test-Connection для этого. Вот один из способов, с небольшими изменениями, чтобы получить дополнительную информацию, которую вы хотите:

Test-Connection -ComputerName $servers -Delay 1 -Count 60 |
    Add-Member -MemberType NoteProperty -Name Date -Value (Get-Date) -PassThru |
    Add-Member -MemberType NoteProperty -Name Status -Value $(if($_.ResponseTime -gt 5){"Failed"}else{"Succeeded"}) -PassThru

Это будет пинговать каждый сервер в $servers один раз в секунду в течение 60 секунд и выводить стандартные объекты с двумя новыми свойства: Date (datetime of ping) и Status (удалось или не удалось?)

Вы можете их захватить, отобразить на экране или отправить в файл. Например, чтобы записывать данные, сохраняя их в CSV, вы можете просто добавить следующее:

| Export-Csv .\ping.csv

CSV будет содержать больше информации, чем вам нужно, так что вы можете

EDIT: отображение пользовательских свойств

. Чтобы просмотреть пользовательские свойства в консоли, выполните следующие действия: , добавьте следующее:

| Format-Table PsComputerName, Date, ResponseTime, Status

4
ответ дан boxdog 17 August 2018 в 12:39
поделиться
  • 1
    Кажется, это просто Test-Connection, а не выход Failed или Succeeded или дата :( – peterbonar 13 July 2018 в 15:07
  • 2
    Поскольку выход является одним и тем же типом объекта (с модификациями), дисплей по умолчанию будет таким же, как и обычный. Вам нужно будет использовать настраиваемое форматирование вывода. Я отредактировал свой ответ, чтобы показать, как просмотреть дополнительную информацию. – boxdog 13 July 2018 в 15:17
  • 3
    Вероятно, это лучший способ сделать это – ArcSet 13 July 2018 в 15:41
  • 4
    ЕСЛИ этот ответ сработал для вас, отметьте его как правильный – ArcSet 13 July 2018 в 17:21
Другие вопросы по тегам:

Похожие вопросы: