找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 72963|回复: 15

[文件操作] [已解决]批处理如何查找出前缀相同的文件名中数字后缀缺号的文件

[复制链接]
发表于 2016-8-7 08:13:34 | 显示全部楼层 |阅读模式
本帖最后由 kaze 于 2016-8-8 21:13 编辑

批处理如何检查文件是否按顺序命名
批处理检查文件是否按顺序命名:

现当前目录及子目录有一堆小说文档,正确规范的命名方式结尾是-1.txt ,-2.txt, -3.txt ...
例:
A-a1-about-night-1.txt
A-a1-about-night-2.txt
A-a1-about-night-3.txt
.
.
.
A-a1-chapter2-day-2.txt
A-a1-chapter2-day-4.txt
A-a1-chapter2-day-.txt
A-a1-chapter2-day-2 (1).txt

前面数值一样的是同一个章节,
有没有方法找出不是按顺序命名的文件名称输出成txt,
(比如找出缺少A-a1-chapter2-day-1.txt A-a1-chapter2-day-3.txt,错误 A-a1-chapter2-day-.txt   A-a1-chapter2-day-2 (1).txt)
感觉无从下手啊,没有思路,不知道有没有人能够解决?

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2016-8-7 10:55:01 | 显示全部楼层
1、“图片名称”是什么鬼,你实际要处理的是什么类型文件?
2、假设有一系列文件1-7,实际应还有8,如何知道缺的不是最后一个?
3、文件名前缀相同的文件如何分布,都在同一文件夹里,还是会有分布在不同文件夹里的情况?
4、所谓“错误”的文件如何处理,删除?不管?也输出到txt文本?
 楼主| 发表于 2016-8-7 11:32:33 | 显示全部楼层
本帖最后由 kaze 于 2016-8-7 11:34 编辑

回复 2# pcl_test

1.脚本要通用,现在主要处理txt后缀文档
   
2.【假设有一系列文件1-7,实际应还有8,如何知道缺的不是最后一个?】缺最后一个不用考虑

3.同一文件夹里,当前文件夹及子文件夹。

4.仅输出 ,错误+缺少的 文件名称含路径
发表于 2016-8-7 15:31:58 | 显示全部楼层
本帖最后由 pcl_test 于 2016-8-8 18:14 编辑
  1. /*&cls
  2. @echo off
  3. rem 如果是读取文本下句改为 type "文件列表.txt"|cscript -nologo -e:jscript "%~f0"
  4. (dir /a-d/b/s *-*.txt)|cscript -nologo -e:jscript "%~f0"
  5. pause&exit
  6. */
  7. var fso = new ActiveXObject('Scripting.FileSystemObject');
  8. var list = WSH.StdIn.ReadALL().split(/\r\n/), a={}, s1=s2='';
  9. for(var i=0; i<list.length; i++){
  10.     if(!/\d+\.[^\.\\]+$/.test(list[i])){
  11.         s1+=list[i]+'\r\n';
  12.     }else{
  13.         var fpath = list[i].replace(/\d+\.[^\.\\]+$/, '');
  14.         var num = parseInt(fso.GetBaseName(list[i]).match(/\d+$/));
  15.         var ext = '.'+fso.GetExtensionName(list[i]);
  16.         var t = (fpath+'|'+ext).toLowerCase();
  17.         if(!a[t]){
  18.             a[t]={'max':num};
  19.         }else{
  20.             if(num>a[t]['max'])a[t]['max']=num;
  21.         }
  22.         a[t][num]=1;
  23.     }
  24. }
  25. for(var b in a){
  26.     var m = b.split('|');
  27.     for(var i=1; i<=a[b]['max']; i++){
  28.         if(!a[b][i]){s2+=(!m[0]?i:m[0]+i)+m[1]+'\r\n';}
  29.     }
  30. }

  31. WSH.echo('不符合--------------------------\r\n'+s1+'\r\n缺号的--------------------------\r\n'+s2);
  32. //WSH.echo('缺号的--------------------------\r\n'+s2);fso.CreateTextFile('处理结果.txt', 2).Write(s2);
复制代码

评分

参与人数 1技术 +1 收起 理由
kaze + 1 谢谢

查看全部评分

发表于 2016-8-7 16:17:50 | 显示全部楼层
本帖最后由 xxpinqz 于 2016-8-7 16:39 编辑

忘了差不多了。。。。
  1. @echo off&setlocal enabledelayedexpansion
  2. ::下一行50表示最大值,自己改
  3. for /l %%a in (50,-1,1) do set "c=!c!,%%a,"
  4. (for /f "delims=" %%a in ('dir /b/s *-*.txt') do (
  5.     set "str=%%~na"
  6.     set "str=!str:-=.1!"
  7.     for /f "delims=" %%b in ("!str!") do (
  8.         set "n=%%~xb"
  9.         set/a "1/(!n:.=!-1)" && (
  10.                 if not defined #%%~nb (
  11.                         set #%%~nb=.
  12.                         if !max! gtr 0 for %%c in (!max!) do (
  13.                             set num=!num:*,%%c,=!
  14.                             if not "!num!"=="" echo,!file:.1=-!!num:,= !
  15.                         )
  16.                         set num=%c%
  17.                         set "file=%%~dpnb文件缺少:"
  18.                         set max=0
  19.                 )
  20.                 set n=!n:~2!
  21.                 for %%c in (!n!) do set num=!num:,%%c,=!&if %%c gtr !max! set/a max=1+%%c
  22.         )||echo,%%a----错误
  23. )))2>nul
  24. if !max! gtr 0 for %%c in (!max!) do (
  25.     set num=!num:*,%%c,=!
  26.     if not "!num!"=="" echo,!file:.1=-!!num:,= !
  27. )
  28. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
kaze + 1 谢谢

查看全部评分

 楼主| 发表于 2016-8-7 16:19:48 | 显示全部楼层
谢谢,我拿来测试了一下,符合要求,处理了一堆艺术家图片,(以前foobar2000通过lastfm插件下载的),有一些不连续的软件不读取,虽然有些图片是png格式(可以用软件改名).现在问题是:
能不能直接对一个txt文件处理?(文件名一行一行的)
还有我在echo后面加上>test.txt,会出错啊?
发表于 2016-8-7 22:05:09 | 显示全部楼层
回复 6# kaze


5楼代码第4行:
(for /f "delims=" %%a in ('dir /b/s *-*.txt') do (
改成:
(for /f "delims=" %%a in ('type "文件列表.txt"') do (
 楼主| 发表于 2016-8-7 23:25:02 | 显示全部楼层
回复 7# GNU
回复 5# xxpinqz

5楼的批处理通用性不强,最大值其实不是固定的(小于20),我把它改成了20,改了几个字,加了一段
dir /b/s *.*p*g | sort>>文件列表.txt
结合7楼
运行结果就是这样的,
4楼的符合要求,可是要怎样修改直接读取文件列表.txt
呢?
发表于 2016-8-7 23:33:32 | 显示全部楼层
回复 8# kaze

指定回应某楼层的在相应楼层点回复
你的文件列表.txt的内容是怎样的,打包发附件看看
 楼主| 发表于 2016-8-7 23:51:06 | 显示全部楼层
回复 9# pcl_test

我加了一段
dir /b/s *.*p*g | sort>>文件列表.txt
,并手动替换png为jpg,后这是处理完成的,
如果修改四楼代码,直接读取直接读取文件列表.txt
那任务就完成了(不需要考虑未编号文件,因为我希望能用在其他地方)

评分

参与人数 1PB -3 收起 理由
pcl_test -3 打包发附件

查看全部评分

发表于 2016-8-8 09:04:46 | 显示全部楼层
回复 8# kaze

没看清楚是要输出完整路径,要输出还更简单点,找不到文件是你dir的文件列表有这值。
 楼主| 发表于 2016-8-8 11:16:59 | 显示全部楼层
回复 11# xxpinqz

你好,要输出完整路径,因为代码通用,能用在其他地方,现在是检查jpg后缀的图片,四楼代码符合要求,如果能修改成 直接读取 文件列表.txt就好了。
发表于 2016-8-8 13:55:21 | 显示全部楼层
回复 10# kaze

4楼已改
 楼主| 发表于 2016-8-8 18:50:28 | 显示全部楼层
回复 13# pcl_test

谢谢,我加了几句,发现可以用,很好,
但是最后两句话貌似要改成:
WSH.echo('不符合--------------------------\r\n'+s1+'\r\n缺号的--------------------------\r\n'+s2);fso.CreateTextFile('处理结果.txt', 2).Write(s1+'\r\n'+s2);
你看对不对呢?
发表于 2016-8-8 18:54:05 | 显示全部楼层
回复 14# kaze

嗯,自己看着办吧,我这样补上去不是没有原因的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 12:51 , Processed in 0.022172 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表