持续Ping批处理脚本输出CSV异常:无法识别连接中断
解决批处理Ping脚本无法识别连接中断的问题
我一眼就看出你的问题所在了——你的for /F循环和%errorlevel%的用法都踩了批处理的经典坑:
问题根源
- Ping失败时循环根本不执行:当Ping不通目标时,
ping命令不会输出包含TTL=的行,所以findstr /i "TTL="会返回错误码1且无任何输出。这时候for /F因为没有可处理的内容,直接跳过整个循环体,导致你写的if %errorlevel%判断完全没机会运行,自然不会跳转到失败标签。 %errorlevel%的时机错误:批处理里的变量是预解析的,在for循环定义阶段,%errorlevel%就已经被替换成了循环执行前的错误码,不是当前ping命令的返回值,所以即使循环执行了,这个判断也是无效的。
修正后的脚本
下面是调整后的完整代码,我把Ping执行、结果判断、响应时间提取拆分开,确保错误状态能被正确捕获:
@ECHO OFF @SETLOCAL EnableDelayedExpansion set internetAddress=8.8.8.8 set routerAddress=192.168.1.0 set speed=2 :: 修正文件名的时间格式,避免小时是个位数时出现空格 set "filename=C:\PingTest\PingResults\PingTest_%time:~0,2%_%time:~3,2%_%time:~6,2%_%date:~-10,2%_%date:~-7,2%_%date:~-4,4%.csv" :: 确保输出目录存在,避免写入失败 if not exist "C:\PingTest\PingResults\" mkdir "C:\PingTest\PingResults\" :: 写入CSV表头 echo Type, Status, Time, Date, ms >> %filename% :loop :: 获取当前时间和日期(用延迟变量避免预解析问题) set "currentTime=%time:~0,2%:%time:~3,2%:%time:~6,2%" set "currentDate=%date:~-10,2%/%date:~-7,2%/%date:~-4,4%" :: ===== 处理公网Ping ===== ping -4 -n 1 %internetAddress% > ping_temp.txt if %errorlevel% equ 0 ( :: Ping成功,提取响应时间 for /F "tokens=7 delims==< " %%G in ('findstr /i "TTL=" ping_temp.txt') do set "ims=%%G" echo internet = success @ !ims! - !currentTime! !currentDate! echo internet, success, !currentTime!, !currentDate!, !ims! >> %filename% ) else ( :: Ping失败 set "ims=n/a" echo internet = failure @ !ims! - !currentTime! !currentDate! echo internet, failure, !currentTime!, !currentDate!, !ims! >> %filename% ) :: 等待指定时间 PING localhost -n %speed% >NUL :: ===== 处理路由器Ping ===== ping -4 -n 1 %routerAddress% > ping_temp.txt if %errorlevel% equ 0 ( :: Ping成功,提取响应时间 for /F "tokens=7 delims==< " %%A in ('findstr /i "TTL=" ping_temp.txt') do set "rms=%%A" echo router = success @ !rms! - !currentTime! !currentDate! echo router, success, !currentTime!, !currentDate!, !rms! >> %filename% ) else ( :: Ping失败 set "rms=n/a" echo router = failure @ !rms! - !currentTime! !currentDate! echo router, failure, !currentTime!, !currentDate!, !rms! >> %filename% ) :: 等待指定时间并循环 PING localhost -n %speed% >NUL goto loop :: 清理临时文件(脚本正常退出时执行,循环脚本一般不会走到这) :cleanup if exist ping_temp.txt del ping_temp.txt ENDLOCAL
关键改动说明
- 启用延迟变量扩展:添加
EnableDelayedExpansion,用!变量名!替代%变量名%,这样在循环和条件判断里能获取到运行时的变量值,避免预解析问题。 - 拆分Ping执行与判断:先单独执行
ping命令并把输出存到临时文件,直接用%errorlevel%判断Ping是否成功——这是最可靠的方式,因为ping命令通时返回0,不通时返回非0。 - 先判断状态再提取响应时间:只有Ping成功时,才去提取
TTL=行里的响应时间;失败时直接设置ms=n/a,避免无效的提取操作。 - 修复文件名格式:原文件名里的时间部分如果是凌晨(小时为个位数,比如
9:05:00)会包含空格,改成用下划线分隔,避免文件名异常。 - 自动创建输出目录:如果目标目录不存在,脚本会自动创建,避免写入CSV时因路径不存在报错。
验证效果
现在Ping失败时,脚本会正确输出failure状态,CSV里的MS列也会显示n/a,完全符合你预期的结果。
内容的提问来源于stack exchange,提问作者Jamie P
相关产品推荐
相关产品推荐

