逐行对比before.txt与after.txt首列的批处理脚本问题
解决批处理逐行对比两个文件第一列的问题
哦,我一眼就看出问题所在了——你现在的代码是两个独立的FOR循环:先把before.txt从头到尾遍历一遍,最后variable1只保留了文件最后一行的第一列值;接着又把after.txt遍历一遍,variable2同样只留最后一行的值。难怪运行后只会重复输出最后那个哈希值!
要实现逐行对应对比,我们需要同步读取两个文件的同一行内容。批处理没有直接支持同时遍历两个文件的语法,但我们可以用行号作为桥梁,逐行提取对应位置的内容来对比。
修改后的完整代码
@echo off setlocal enabledelayedexpansion :: 获取两个文件的总行数 for /f %%a in ('find /c /v "" ^< before.txt') do set "lines_before=%%a" for /f %%a in ('find /c /v "" ^< after.txt') do set "lines_after=%%a" :: 处理行数不一致的情况 if not !lines_before! equ !lines_after! ( echo ⚠️ 警告:两个文件行数不匹配! echo before.txt 有 !lines_before! 行,after.txt 有 !lines_after! 行 echo 将按照行数较少的文件进行对比 if !lines_before! lss !lines_after! ( set "total_lines=!lines_before!" ) else ( set "total_lines=!lines_after!" ) ) else ( set "total_lines=!lines_before!" ) echo 开始逐行对比两个文件的第一列... echo ====================================== :: 逐行循环对比 for /l %%i in (1,1,!total_lines!) do ( :: 初始化变量,避免残留上一次的值 set "var_before=" set "var_after=" :: 提取before.txt第%%i行的第一列 for /f "tokens=2 delims=:" %%g in ('findstr /n "^" before.txt ^| findstr "^%%i:"') do ( for /f "tokens=1 delims= " %%h in ("%%g") do set "var_before=%%h" ) :: 提取after.txt第%%i行的第一列 for /f "tokens=2 delims=:" %%g in ('findstr /n "^" after.txt ^| findstr "^%%i:"') do ( for /f "tokens=1 delims= " %%h in ("%%g") do set "var_after=%%h" ) :: 输出对比结果 echo 第 %%i 行: echo Before: !var_before! echo After : !var_after! if /i "!var_before!" equ "!var_after!" ( echo 结果:✅ 一致 ) else ( echo 结果:❌ 不一致 ) echo -------------------------------------- ) endlocal
代码关键说明
- 行数统计与校验:用
find /c /v ""统计文件行数,提前检查两个文件行数是否一致,避免出现对比不完整的情况。 - 行号定位:
findstr /n "^"给每一行加上行号前缀(格式为行号:内容),再用findstr "^%%i:"精准筛选出第%%i行的内容。 - 提取第一列:先通过
tokens=2 delims=:提取行号后的完整内容,再用tokens=1 delims=提取内容的第一列(以空格为分隔符)。 - 延迟变量扩展:启用
enabledelayedexpansion,确保在循环内部能正确读取实时更新的变量值。
内容的提问来源于stack exchange,提问作者Oleg_08
相关产品推荐
相关产品推荐

