【问题标题】:Windows cmd/Powershell, ping every second even during timing outWindows cmd/Powershell,即使在超时期间也每秒 ping 一次
【发布时间】:2021-04-14 11:37:34
【问题描述】:

我有以下用于每秒记录 ping 的 PS 代码:

ping -t google.com | Foreach{"{0} - {1}" -f (Get-Date),$_} >> filename.txt

它确实记录秒,也就是说,如果 ping 是 140 毫秒,则下一个 ping 请求在 860 毫秒内,因为我似乎有 秒的数据而没有跳过. 但是,当发生超时时,每次正好跳过 5 秒:

12. 4. 2021 16:13:10 - Reply from 172.217.19.110: bytes=32 time=20ms TTL=111
12. 4. 2021 16:13:11 - Reply from 172.217.19.110: bytes=32 time=79ms TTL=111
12. 4. 2021 16:13:16 - Request timed out.
12. 4. 2021 16:13:17 - Reply from 172.217.19.110: bytes=32 time=26ms TTL=111
12. 4. 2021 16:13:18 - Reply from 172.217.19.110: bytes=32 time=67ms TTL=111

很难相信每次发生这种情况时,连接丢失正好 5 秒,然后恢复;似乎超时“阻止”了新的 ping 命令。有没有办法绕过这个?

【问题讨论】:

  • 你试过ping -w 1000 -t …吗?
  • Default timeout of ping 是 4 秒。考虑到这一点,我认为在下一次尝试之前看到未到达(或返回)的 ping 之间的 5 秒间隔是非常可行的。如@aschipfl 所述,您可以尝试将超时设置为 1 秒。
  • @aschipfl 将超时设置为 1000 有时会导致它“跳过” ping 命令一秒钟; 900ms 修复它。但我的问题是是否可以设置说 5000 毫秒超时,但仍然每秒执行一个 ping 请求?
  • 好吧,那么您将不得不同时执行 ping,因为即使另一个可能超时,您也需要 ping,而 ping 命令无法做到这一点。
  • 反正我也不知道ping到底是怎么计时的;在成功的尝试;但是,一旦 ping 尝试失败,就会考虑额外的延迟,这是所有超时的总和……

标签: powershell ping


【解决方案1】:

您会看到默认的数据包请求超时。默认情况下,Windows 系统会在 ping 请求超时之前等待 4,000 毫秒。添加一点延迟以冒泡到您的脚本,然后就可以了。

可以通过参数/w修改超时时间

例如。这将强制超时为 1 秒。我想你会看到在响应传递之前的超时间隔之后还有 1 秒的延迟。

ping www.google.com /w 1000

您想知道的关于 Windows 上 ping 的所有信息都可以在 Microsoft 的网站上通过 Google 搜索 Microsoft Ping 命令找到。它将是位于列表顶部或附近的 docs.microsoft.com 的结果。

【讨论】:

  • 感谢您的解释。当我写到另一条评论时,这在大约 900 毫秒内有效,因为上一个 ping 请求总是在 仍然每秒执行一个 ping 请求?
【解决方案2】:

Powershell 7 有一个 -timeoutseconds 参数。

 test-connection -TimeoutSeconds 1 microsoft.com -count 1

   Destination: microsoft.com

Ping Source           Address                   Latency BufferSize Status
                                                   (ms)        (B)
---- ------           -------                   ------- ---------- ------
   1 DELL             *                               *          * TimedOut

或者您可以在 .net 中进行自己的 ping 操作并设置 100 毫秒的超时时间。

Function Get-Ping  {

  Param (
    [parameter(ValueFromPipeline)]
    [string[]]$Hostname='yahoo.com'
  )

  Begin {
    $Ping = New-Object System.Net.Networkinformation.ping
    $Timeout = 100 # ms
  }

  Process {
      $Ping.Send($hostname, $timeout)  | Add-Member -passthru hostname $hostname[0] | 
      select hostname,address,status,roundtriptime
  }

}


get-ping microsoft.com

hostname      Address   Status RoundtripTime
--------      -------   ------ -------------
microsoft.com         TimedOut             0

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 2021-07-25
    • 2018-10-22
    • 2014-04-15
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多