编写批处理脚本:根据文件内容提取关键字批量重命名文件求助
批量重命名发票文件解决方案
以下是修正后的批处理脚本,可实现遍历目录下的.txt文件,提取Invoice No和Account Code对应的值,并按要求重命名文件:
@echo off setlocal enabledelayedexpansion for %%F in (*.txt) do ( set "invoiceNo=" set "accountCode=" :: 逐行读取文件内容,提取目标值 for /f "usebackq tokens=1-4 delims=: " %%A in ("%%F") do ( if "%%A %%B" equ "Invoice No" ( set "invoiceNo=%%D" ) else if "%%A %%B" equ "Account Code" ( set "accountCode=%%D" ) ) :: 验证值是否完整,再执行重命名 if defined invoiceNo if defined accountCode ( ren "%%F" "%%~nF_!invoiceNo!_!accountCode!.txt" echo 已完成重命名:"%%F" → "%%~nF_!invoiceNo!_!accountCode!.txt" ) else ( echo 警告:文件"%%F"未找到完整的发票编号或账户代码,跳过处理 ) ) endlocal
脚本关键说明
- 延迟变量扩展:通过
setlocal enabledelayedexpansion启用,确保在for循环内部能正确引用动态变化的变量(用!变量名!代替%变量名%)。 - 内容提取逻辑:内层
for /f循环以:和空格作为分隔符,逐行解析文件内容,匹配到目标行时提取对应的值(%%D即为冒号后第一个非空格的有效内容)。 - 安全重命名:使用
%%~nF获取原文件的主名(不含扩展名),保留原文件名前缀后拼接提取到的编号和代码,避免丢失原有标识。 - 错误处理:增加值存在性检查,仅当两个目标值都成功提取时才执行重命名,避免无效操作。
原脚本问题分析
- 未启用延迟变量扩展,导致循环内变量引用失效;
- 使用
SET /P读取临时文件仅能获取第一行内容,无法正确读取第二行的账户代码; - 重命名逻辑丢失了原文件名的前缀,不符合需求;
- 依赖临时文件增加了出错风险,且未做有效性校验。
内容的提问来源于stack exchange,提问作者Ricky KSK
相关产品推荐
相关产品推荐

