如果连续的ping失败,启动traceroute脚本并将其输出到日志

10

我想要不断地ping我的家庭公共IP地址,如果ping失败,则自动执行traceroute以查看失败在哪里。

我一直在尝试遵循这里的评论:

http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/efc97c66-60a6-4fd7-8be4-4b454d040ce5

最好是兼容Windows,bat或vbs最佳。

从互联网的任何地方,我都会失去与我的家庭网络的连接。我已经开始了一个ping,当它掉线时,我做了一个traceroute,但它在到达我的IP之前就失败了。

我需要一个日志文件来证明这不是我的调制解调器、路由器或计算机的问题。

5个回答

14
@echo off
set Address=google.com
:Loop
PING -n 5 127.0.0.1>nul
echo Pinging %Address%
%SystemRoot%\system32\ping.exe -n 1 %Address% | %SystemRoot%\system32\find.exe "TTL=" > NUL >> C:\pingtest\logfile.log
if %ERRORLEVEL% EQU 0 goto :Loop
echo Trace route %Address% at %date% %time% >> C:\pingtest\logfile.log
tracert %Address% >> C:\pingtest\logfile.log
goto Loop

这就是我最终选择的方法,如果还有其他人需要,可以参考一下。实际上,“Ping -n 127.0.0.1>Nul”是为了添加一个5秒计时器,以便每5秒只对目标进行ping操作,5可以更改为任何所需值。

Windows 7存在这样的问题,即ping命令的结果可能会出现类似于“来自192.168.1.5的回复:目标主机不可达”的情况。因此,它不会报错,而是从自身获得回复,而不是错误级别1。 我选择查找TTL无结果而非寻找错误级别1,使用“%SystemRoot%\system32\ping.exe -n 1 %Address% | %SystemRoot%\system32\find.exe "TTL=" > NUL”

无论如何,我相信这里的其他答案很相似并且可能有效,所以我会将它们排名,但选择这个作为答案。

谢谢大家!


使用带有-n -q 5的pathping可以加速并提供详细的统计信息。或者使用带有-d选项的tracert。这些选项可以去除DNS解析时间(每次都做这个是有点无意义的...它总是一样的),并且更有可能捕获上游的瞬时故障。 - James Newton
肯定的是,每次DNS都不会一样。在我的某个网络中,DNS服务器通常是问题所在! - Auspex
我想做同样的事情,但在Linux(Ubuntu 18.04)上,有什么建议吗? - Nicolas Molano
感谢提供脚本,我会看看它是否能够解决我目前遇到的问题。我稍微修改了一下: @echo off set Address=google.com set Delay=5 echo %date% %time% 每隔 %Delay% 秒 Ping %Address% >> C:\pingtest\logfile.log :Loop PING -n %Delay% 127.0.0.1>nul echo %date% %time% 正在 Ping %SystemRoot%\system32\ping.exe -n 1 %Address% | %SystemRoot%\system32\find.exe "TTL=" > NUL >> C:\pingtest\logfile.log if %ERRORLEVEL% EQU 0 goto :Loop echo %date% %time% 跟踪路由 %Address% >> C:\pingtest\logfile.log tracert %Address% >> C:\pingtest\logfile.log goto Loop - Daniel Flöijer

5
@echo off
set Address=www.google.com
set LogDir=C:\pingtest
md %LogDir%
%SystemRoot%\explorer.exe "%LogDir%"
echo PingTest script to monitor network connection.  Control-C to exit.
echo Tests connection by pinging %Address%.  Logs to %LogDir%\logfile.log.
echo %date% %time% Initial tracert (trace route) to %Address% >> %LogDir%\logfile.log
tracert %Address% >> %LogDir%\logfile.log
:Loop
REM  5 second delay
PING -n 5 -w 1 127.0.0.1>nul
echo %date% %time% Pinging %Address%
echo %date% %time% Pinging %Address% >> %LogDir%\logfile.log
%SystemRoot%\system32\ping.exe -n 1 %Address% | %SystemRoot%\system32\find.exe "TTL=" > NUL
if %ERRORLEVEL% EQU 0 goto :Loop
echo %date% %time% PING ERROR - Tracing route to %Address%
echo %date% %time% PING ERROR - Tracing route to %Address% >> %LogDir%\logfile.log
tracert %Address% >> %LogDir%\logfile.log
goto Loop

4
您可以制作一个简单的批处理文件,尝试ping,如果失败则执行tracert,例如:

您可以制作一个简单的批处理文件,尝试ping,如果失败则执行tracert,例如:

setlocal
set host=www.bigpond.com
set logfile=nettest.log
echo %date% %time%>>%logfile%
ping %host%>>%logfile%
if ERRORLEVEL 1 tracert %host%>>%logfile
endlocal

这里有很大的改进空间。

然后创建一个定时任务,每五分钟运行一次或其他适合您的时间。

或者您可以包含一个带有“sleep”的循环。在批处理文件中休眠中有一个简单的休眠方法:

choice /d y /t 5 > nul

自从Windows 7和Server 2018以来,我们就有了timeout命令。 - Michel de Ruiter
谢谢@MicheldeRuiter,我猜当我写这篇文章时还没有转移到Windows 7。感谢您的改进。 - Richard A

2
:LOOP
FOR /F "usebackq tokens=1" %%F IN (`ping localhost -n 1 -w 1 ^| find "Request"`) DO (
  IF "%%F"=="Request" (
    tracert localhost
  )
)>>log.txt
FOR /F "usebackq tokens=1-4 delims=:." %%G IN (`echo %time%`) DO IF %G%H GTR 1400 GOTO:EOF
GOTO LOOP

基本上,这段代码的作用是执行 ping 命令,如果发现有一个包含单词 Request 的行(只有在无法 ping 通地址时才会出现),则执行 tracert 命令。在 PING 命令中,-n-w 开关告诉它只跳一次,并在未收到响应的情况下超时 1 秒钟。如果您正在 ping 自己的 localhost,则完全没有问题。第二个 FOR 语句是为了设置停止点。将 1400 更改为您希望脚本停止的时间(当然要使用军事时间)。


这一行对我没用:FOR /F "usebackq tokens=1-4 delims=:." %%G IN (echo %time%) DO IF %G%H GTR 1400 GOTO:EOF需要改为:FOR /F "usebackq tokens=1-4 delims=:." %%G IN (echo %time%) DO IF %%G%%H GTR 1400 GOTO:EOF - Lucius

0

我刚刚在寻找相同的事情,以调查为什么 VPN 在有线连接上不断掉线,使用了上面其中一个批处理文件建议,效果很好。 此外,在这里找到了一个不错的小型 Java 应用程序,可以将其打包给您使用 Internet Connectivity Monitor

易于使用,而且功能强大 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接