Batch脚本问题:无法标记失败文件且无法复制指定内容段
修正后的Batch脚本实现方案
功能说明
- 遍历当前目录及所有子目录下的
.diff文件 - 搜索指定字符串,生成检测汇总文件(记录哪些文件包含目标字符串)
- 将包含目标字符串的文件中,从该字符串到停止标记的内容提取并合并到统一输出文件
脚本代码
@echo off setlocal enabledelayedexpansion :: 配置参数,根据实际需求修改 set "SEARCH_STR=需要搜索的指定字符串" set "STOP_MARKER=停止标记字符串" set "SUMMARY_FILE=detection_summary.txt" set "MERGED_FILE=merged_content.txt" :: 初始化输出文件 echo 检测汇总报告 > "%SUMMARY_FILE%" echo ====================================== >> "%SUMMARY_FILE%" echo. >> "%SUMMARY_FILE%" echo 合并提取内容 > "%MERGED_FILE%" echo ====================================== >> "%MERGED_FILE%" echo. >> "%MERGED_FILE%" :: 遍历所有子目录下的.diff文件 for /r %%f in (*.diff) do ( set "found=0" set "extract=0" echo 正在检测文件: %%f >> "%SUMMARY_FILE%" :: 逐行读取文件内容 for /f "usebackq delims=" %%l in ("%%f") do ( :: 检查是否找到目标字符串 if "!found!"=="0" ( echo "%%l" | findstr /c:"%SEARCH_STR%" >nul if not errorlevel 1 ( set "found=1" set "extract=1" echo 找到目标字符串,开始提取内容 >> "%SUMMARY_FILE%" echo. >> "%MERGED_FILE%" echo --- 来自文件: %%f --- >> "%MERGED_FILE%" echo %%l >> "%MERGED_FILE%" ) ) else ( :: 检查是否到达停止标记 echo "%%l" | findstr /c:"%STOP_MARKER%" >nul if not errorlevel 1 ( set "extract=0" echo 到达停止标记,停止提取 >> "%SUMMARY_FILE%" ) :: 如果处于提取状态,写入内容 if "!extract!"=="1" ( echo %%l >> "%MERGED_FILE%" ) ) ) :: 标记文件检测结果 if "!found!"=="1" ( echo [失败] 文件 %%f 包含目标字符串 >> "%SUMMARY_FILE%" ) else ( echo [成功] 文件 %%f 未检测到目标字符串 >> "%SUMMARY_FILE%" ) echo. >> "%SUMMARY_FILE%" ) echo. >> "%SUMMARY_FILE%" echo 检测完成,汇总已保存到 %SUMMARY_FILE% echo 提取内容已合并到 %MERGED_FILE% pause endlocal
关键修正点说明
- 延迟扩展启用:通过
setlocal enabledelayedexpansion解决for循环内变量更新无法即时读取的问题,循环内调用变量需用!变量名!而非%变量名% - 循环变量区分:外层遍历文件用
%%f,内层逐行读取用%%l,避免变量冲突 - 状态标记逻辑:用
found标记是否找到目标字符串,extract标记是否处于内容提取状态,清晰区分不同处理阶段 - 错误判断优化:利用
findstr的errorlevel判断字符串是否存在,errorlevel 0表示找到目标,errorlevel 1表示未找到
内容的提问来源于stack exchange,提问作者Sara Weindorf
相关产品推荐
相关产品推荐

