如何改造批处理脚本批量提取多嵌套目录下TXT的指定标记区间文本
批处理提取脚本批量改造方案
- 递归遍历:通过
for /r指令扫描源根目录下所有层级的TXT文件,覆盖多层嵌套子文件夹中的千余个零散命名文件 - 目录镜像:处理每个文件时自动截取源文件相对根目录的路径片段,在输出根目录下自动创建对应的嵌套文件夹,保证输出目录结构和源目录完全对齐
- 合并输出:单文件处理流程内连续完成两个标记区间的内容抓取,直接顺序写入和源文件同名的输出文件,不会生成两个拆分的独立文件
可直接运行的改造后脚本
@echo off setlocal enabledelayedexpansion :: ========== 可修改配置区 ========== set "SOURCE_ROOT=D:\你的源TXT根目录" set "OUTPUT_ROOT=D:\提取结果输出目录" set "MARK1_START=^name" set "MARK1_END=^location" set "MARK2_START=^City" set "MARK2_END=^Place" :: ================================== :: 全路径递归扫描所有TXT文件 for /r "%SOURCE_ROOT%" %%f in (*.txt) do ( :: 计算镜像目录路径 set "CUR_FULL_PATH=%%~dpf" set "REL_PATH=!CUR_FULL_PATH:%SOURCE_ROOT%=!" set "TARGET_DIR=%OUTPUT_ROOT%\!REL_PATH!" :: 自动创建缺失的嵌套目录 if not exist "!TARGET_DIR!" md "!TARGET_DIR!" set "OUTPUT_FILE=!TARGET_DIR!%%~nxf" :: 清空目标输出文件 break > "!OUTPUT_FILE!" :: 提取第一组标记区间内容 set "LINE_S1=" set "LINE_E1=" for /f "delims=" %%l in ('findstr /n /b /c:"%MARK1_START%" "%%f"') do set "LINE_S1=%%l" for /f "delims=" %%l in ('findstr /n /b /c:"%MARK1_END%" "%%f"') do set "LINE_E1=%%l" if defined LINE_S1 if defined LINE_E1 ( for /f "tokens=1,2 delims=:" %%a in ("!LINE_S1! !LINE_E1!") do ( if %%a lss %%b ( set /a "SKIP1=%%a - 1" for /f "delims=" %%o in ('more +!SKIP1! "%%f"') do echo %%o >> "!OUTPUT_FILE!" ) ) ) :: 提取第二组标记区间内容(追加到同一文件) set "LINE_S2=" set "LINE_E2=" for /f "delims=" %%l in ('findstr /n /b /c:"%MARK2_START%" "%%f"') do set "LINE_S2=%%l" for /f "delims=" %%l in ('findstr /n /b /c:"%MARK2_END%" "%%f"') do set "LINE_E2=%%l" if defined LINE_S2 if defined LINE_E2 ( for /f "tokens=1,2 delims=:" %%a in ("!LINE_S2! !LINE_E2!") do ( if %%a lss %%b ( set /a "SKIP2=%%a - 1" for /f "delims=" %%o in ('more +!SKIP2! "%%f"') do echo %%o >> "!OUTPUT_FILE!" ) ) ) ) echo 全量文件处理完成 pause
使用注意事项
- 配置区的路径和标记规则可直接替换为实际值,路径不要带多余的首尾空格
- 脚本匹配标记时默认从行首开始匹配,若实际标记存在前后缀,可直接修改
MARK变量的匹配规则 - 遇到没有对应标记的文件时脚本会自动跳过,不会中断全流程处理
- 如需在两组提取内容之间加分隔空行,可在两组提取逻辑的中间位置添加
echo. >> "!OUTPUT_FILE!"语句
内容的提问来源于stack exchange,提问作者JR Santos
相关产品推荐
相关产品推荐

