批处理遍历文件搜索文本匹配重命名仅首个生效问题求助
批处理脚本遍历匹配重命名问题及解决方案
我需要编写一个批处理脚本,遍历文件夹内的指定文件,搜索文件内部的文本,与我预设在数组中的文本进行比对,若匹配成功则用匹配到的文本作为新名称重命名该文件。目前我写的代码只能部分生效:仅能匹配数组的第一个元素,且仅对第一个文件生效,请问我遗漏了什么?
初始问题代码
cd C:\folder1 set nomes[0]=Report 1 set nomes[1]=Report 2 set nomes[2]=Report 3 set nomes[3]=Report 4 set nomes[4]=Report 5 set SearchString="18/08/21" rem /////////////////////////////////////////////////// rem ////// loop read all files in current folder ////// for %%f in (*.q) do ( set /p val=<%%f SET SUBSTRING=!val:~1,8! rem //////////////////////////////////////////////////////////// rem ////// verify if the file has the current date inside ////// if "!SUBSTRING!"=="%SearchString%" ( rem //////////////////////////////////////////////////////////// rem ////// verify if the file has the hour above 13 hours ///// if "!val:~10,5!" GTR "13" ( set linhanome= for /F "skip=1 delims=" %%I in (%%f) do if not defined linhanome ( set "linhanome=%%~I" rem ////////////////////////////////////////////////////////////////////// rem ////// verify if can find on item from the array inside the file ///// set encontrounome= for /l %%n in (0,1,5) do if not defined encontrounome ( set findtext=!nomes[%%n]! set findfile=%%f findstr /C:!findtext! !findfile! * 2>nul IF ERRORLEVEL 0 ( ECHO CASE TRUE set "encontrounome=true" ren "%%f" "!findtext!.txt" ) ) ) ) ) )
文件格式示例
"18/08/21 14:45 Page 1" "someradomtext someradomtext Report 1
问题原因
- 未开启延迟变量扩展,代码块
()内的变量修改如果不用!包裹取值会无法生效 - 时间截取长度错误:原代码取
!val:~10,5!和"13"对比,实际只需要截取2位小时部分即可,应该改为!val:~10,2! findstr的返回值判断逻辑有误:IF ERRORLEVEL N的含义是“返回值大于等于N”,findstr找到内容返回0、找不到返回1,原判断逻辑永远为真,导致第一次循环就直接标记找到结果- 数组遍历的上限设置错误:原数组只有0-4共5个元素,原循环写了0到5,会出现数组下标越界的问题
- 重命名操作执行后没有跳出文件处理逻辑,可能会出现重复操作问题
修复后可正常运行的代码
cd C:\folder1 set nomes[0]=Report 1 set nomes[1]=Report 2 set nomes[2]=Report 3 set nomes[3]=Report 4 set nomes[4]=Report 5 set SearchString="18/08/21" rem /////////////////////////////////////////////////// rem ////// loop read all files in current folder ////// for %%f in (*.q) do ( set /p val=<%%f SET SUBSTRING=!val:~1,8! rem //////////////////////////////////////////////////////////// rem ////// verify if the file has the current date inside ////// if "!SUBSTRING!"=="%SearchString%" ( rem //////////////////////////////////////////////////////////// rem ////// verify if the file has the hour above 13 hours ///// if "!val:~10,2!" GTR "13" ( rem ////////////////////////////////////////////////////////////////////// rem ////// verify if can find on item from the array inside the file ///// for /l %%n in (0,1,12) do ( set "findtext=!nomes[%%n]!" set "findfile=%%f" IF ERRORLEVEL 0 ( rem //////////////////////////////////////////////////////// rem ////// get the file and copy to the right location ///// FOR /f %%a IN ('%SystemRoot%\System32\findstr /m /C:"!findtext!" "%%f"') DO ( ECHO %%a !findtext! copy "%%a" "!findtext!.txt" ) ) ) ) ) ) pause
内容的提问来源于stack exchange,提问作者SanderM
相关产品推荐
相关产品推荐

