在网络运维工作中,路由追踪(tracert)是最基础也是最常用的网络诊断工具之一。作为一名有着十年网络运维经验的工程师,我深知手动执行tracert命令的痛点:当需要排查跨网段访问延迟、链路丢包等问题时,往往需要同时对十几个甚至几十个节点进行路由追踪。手动逐个执行不仅效率低下,还容易遗漏关键节点,更无法统一保存检测结果进行对比分析。
这个批处理脚本正是为解决这些痛点而生。它基于Windows系统自带的tracert命令,通过批处理脚本实现了:
实测在排查某次跨机房网络延迟问题时,使用这个脚本将原本需要30分钟的手动操作缩短到了1分钟内完成,效率提升显著。
脚本最大的优势是完全基于Windows系统自带组件:
batch复制@echo off
chcp 65001 > nul
这两行代码分别用于关闭命令回显和设置控制台编码为UTF-8。这意味着:
提示:虽然PowerShell功能更强大,但在老旧服务器或严格管控环境中,批处理脚本的兼容性优势无可替代。
脚本通过以下逻辑实现智能过滤:
batch复制for /f "tokens=*" %%a in ('type "%target_file%" ^| findstr /v /c:"#" ^| findstr /v "^$"') do (
tracert -h 15 -w 500 %%a >> "%log_file%"
)
这段代码实现了:
脚本采用tee命令的变通实现方式:
batch复制(
echo [%date% %time%] 开始检测...
for /f ... do (
echo 正在检测: %%a
tracert -h 15 -w 500 %%a | tee -a con >> "%log_file%"
)
) >> "%log_file%"
这样既能在控制台实时查看进度,又能完整保存检测结果到日志文件。
将以下代码保存为batch_tracert.cmd:
batch复制@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion
:: 参数配置
set target_file=targets.txt
set log_file=tracert_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.log
:: 检查目标文件是否存在
if not exist "%target_file%" (
echo # 每行一个检测目标,支持IP和域名 > "%target_file%"
echo # 以#开头的行将被忽略 >> "%target_file%"
echo 8.8.8.8 >> "%target_file%"
echo www.baidu.com >> "%target_file%"
echo 目标模板已生成,请编辑%target_file%后重新运行
pause
exit /b
)
:: 执行批量检测
(
echo [%date% %time%] 开始检测...
for /f "tokens=*" %%a in ('type "%target_file%" ^| findstr /v /c:"#" ^| findstr /v "^$"') do (
echo 正在检测: %%a
tracert -h 15 -w 500 %%a | tee -a con >> "%log_file%"
echo. >> "%log_file%"
)
echo [%date% %time%] 检测完成
) >> "%log_file%"
echo 检测完成,日志已保存到: %log_file%
pause
准备阶段:
D:\network_tools\)targets.txt模板文件配置检测目标:
targets.txt文件执行检测:
tracert_年月日_时分.log注意:建议在目标文件中按网络拓扑顺序排列检测目标,这样生成的日志更便于分析链路走向。
脚本默认使用-h 15 -w 500参数组合:
-h 15:限制最大跳数为15
-w 500:设置等待超时为500ms
如需调整,修改脚本中的tracert命令即可:
batch复制tracert -h 20 -w 1000 %%a
默认日志命名包含日期时间:
batch复制set log_file=tracert_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.log
可以通过修改日期格式实现不同命名风格:
%date:~2,2%%date:~5,2%%date:~8,2%.log%COMPUTERNAME%_tracert.log基础脚本添加错误处理:
batch复制for /f ... do (
echo 正在检测: %%a
tracert -h 15 -w 500 %%a 2>&1 | tee -a con >> "%log_file%"
if errorlevel 1 (
echo [错误] 检测 %%a 失败 >> "%log_file%"
)
echo. >> "%log_file%"
)
2>&1将错误输出重定向到标准输出,确保错误信息也被记录。
现象:日志文件中文显示为乱码
解决方案:
chcp 65001现象:检测某个目标时卡住
排查步骤:
-w 2000-h减少最大跳数现象:重复运行提示"文件正在被使用"
解决方法:
batch复制ping -n 3 127.0.0.1 > nul
现象:所有检测都超时
排查建议:
结合任务计划程序实现自动检测:
将路由追踪与其他检测工具结合:
batch复制:: 先执行ping检测
ping -n 4 %%a >> network_check.log
:: 再执行tracert
tracert -h 15 -w 500 %%a >> network_check.log
添加简单统计功能:
batch复制findstr "请求超时" "%log_file%" > timeout_nodes.txt
findstr /c:"ms" "%log_file%" | findstr /v "请求超时" > normal_nodes.txt
这个脚本在我日常工作中已经成为了不可或缺的工具。特别是在处理跨运营商网络问题时,批量路由追踪能快速定位故障节点。建议运维同行们根据实际需求调整参数,并将其纳入常规网络巡检流程。