Вы можете сделать это без петли:
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
[/g0]
Следующий сценарий использует 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
Этот метод использует 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
Вы можете использовать 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
>> '.\file.log
или pipe вOut-File '.\file.log' -Append -Encoding ascii
– LotPings 16 July 2018 в 11:02