[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】批处理用文件名中的数组查找缺失的文件编号

文件夹内有大批的文件,比如一共500个,命名方式是:
AAAA-BBBB-BD0001-AAASDQW
AAAA-BBBB-BD0002-ASDQWEA
AAAA-BBBB-BD0003-ASDAASD
AAAA-BBBB-BD0005-TFHTRYH
AAAA-BBBB-BD0007-FGHJFGHJ
AAAA-BBBB-BD0008-ASDQWE
……
AAAA-BBBB-BD0100-QWEQWE

类似这样,比如上面缺少了 BD0004/BD0006这个编号,怎么能快速查找缺少的这个呢

我现在的想法是用代码数字生成一个BD0001-BD0500的名称写入到一个TXT里面
然后查找文件名和生成的TXT对比
后面这个步骤不知道怎么写 感谢各位分享
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 qixiaobin0715 于 2024-8-13 10:06 编辑

拿这个主题练练手。
如果连续编号不是从1开始,起始编号与终止编号未知(BD????-BD????),我就是要查找起始编号与终止编号之间的缺失编号,可以这样:
  1. @echo off
  2. set x=9999
  3. set y=0
  4. setlocal enabledelayedexpansion
  5. for /f "tokens=3 delims=-" %%i in ('dir /b /a-d *-*-*-*.*') do (
  6.     for /f "tokens=* delims=BD0" %%j in ("%%i") do (
  7.         if %%j lss !x! set x=%%j
  8.         if %%j gtr !y! set y=%%j
  9.     )
  10. )
  11. for /l %%i in (%x%,1,%y%) do (
  12.     set m=000%%i
  13.     set m=!m:~-4!
  14.     if not exist "*-*-BD!m!-*.*" echo,BD!m!
  15. )
  16. pause
复制代码
这样要通用一些,只要保持文件名第3段格式即可,即使第1、2段字符不一样得到的结果也正常。

TOP

  1. @echo off
  2. cd /d "%~dp0"
  3. rem 定义开头,s=1;不定义则删除下一行
  4. set s=1
  5. setlocal enabledelayedexpansion
  6. for /f "tokens=3 delims=-" %%i in ('dir /b /a-d *-*-*-*.* ^|find /v "%~nx0"') do (
  7. for /f "tokens=* delims=BD0" %%a in ("%%i") do (
  8. if !s! neq %%a (
  9. set /a e=%%a-1
  10. for /l %%l in (!s! 1 !e!) do (
  11. set str=0000000%%l
  12. echo BD!str:~-4!
  13. )
  14. )
  15. set /a s=%%a+1
  16. )
  17. )
  18. endlocal
  19. pause
复制代码
bat小白,请多指教!谢谢!

TOP

如果给定区间的话,还用得着像2楼那么费事。
2楼代码删除2~4行,将第6行的“%n%”改为实际数字比如500即可,这样就不需要预设那么多变量,效率要高一些。

TOP

本帖最后由 aloha20200628 于 2024-8-9 14:29 编辑

回复 1# qq629926132

给一个再简化的版本,有赖于楼主定义的文件名命名格式...
被检查的文件名编号区间 m-n 可自定义,代码第三行中假定=1-500,运行结果会屏显出检查区间中未被匹配成功的编号如 BD0004
  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "tokens=3 delims=-" %%a in (' dir /b/a-d "*-BD????-*" ') do (set "%%a=1")
  3. for /l %%n in (1,1,500) do (set "k=000%%n" &if not defined BD!k:~-4! echo,BD!k:~-4!)
  4. endlocal&pause&exit/b
复制代码

TOP

回复 2# qixiaobin0715


    可以,没问题
感谢,也看懂了

TOP

  1. @echo off
  2. for /f "tokens=3 delims=-" %%i in ('dir /b /a-d *-*-*-*.*') do (
  3.     for /f "tokens=* delims=BD0" %%j in ("%%i") do set n=%%j
  4. )
  5. setlocal enabledelayedexpansion
  6. for /l %%i in (1,1,%n%) do (
  7.     set m=000%%i
  8.     set m=!m:~-4!
  9.     if not exist "*-*-BD!m!-*.*" echo,BD!m!
  10. )
  11. pause
复制代码
1

评分人数

TOP

返回列表