Board logo

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

作者: kaze    时间: 2016-8-7 08:13     标题: [已解决]批处理如何查找出前缀相同的文件名中数字后缀缺号的文件

本帖最后由 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)
感觉无从下手啊,没有思路,不知道有没有人能够解决?
作者: pcl_test    时间: 2016-8-7 10:55

1、“图片名称”是什么鬼,你实际要处理的是什么类型文件?
2、假设有一系列文件1-7,实际应还有8,如何知道缺的不是最后一个?
3、文件名前缀相同的文件如何分布,都在同一文件夹里,还是会有分布在不同文件夹里的情况?
4、所谓“错误”的文件如何处理,删除?不管?也输出到txt文本?
作者: kaze    时间: 2016-8-7 11:32

本帖最后由 kaze 于 2016-8-7 11:34 编辑

回复 2# pcl_test

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

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

4.仅输出 ,错误+缺少的 文件名称含路径
作者: pcl_test    时间: 2016-8-7 15:31

本帖最后由 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);
复制代码

作者: xxpinqz    时间: 2016-8-7 16:17

本帖最后由 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
复制代码

作者: kaze    时间: 2016-8-7 16:19

谢谢,我拿来测试了一下,符合要求,处理了一堆艺术家图片,(以前foobar2000通过lastfm插件下载的),有一些不连续的软件不读取,虽然有些图片是png格式(可以用软件改名).现在问题是:
能不能直接对一个txt文件处理?(文件名一行一行的)
还有我在echo后面加上>test.txt,会出错啊?
作者: GNU    时间: 2016-8-7 22:05

回复 6# kaze


5楼代码第4行:
(for /f "delims=" %%a in ('dir /b/s *-*.txt') do (
改成:
(for /f "delims=" %%a in ('type "文件列表.txt"') do (
作者: kaze    时间: 2016-8-7 23:25

回复 7# GNU
回复 5# xxpinqz

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

回复 8# kaze

指定回应某楼层的在相应楼层点回复
你的文件列表.txt的内容是怎样的,打包发附件看看
作者: kaze    时间: 2016-8-7 23:51

回复 9# pcl_test

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

回复 8# kaze

没看清楚是要输出完整路径,要输出还更简单点,找不到文件是你dir的文件列表有这值。
作者: kaze    时间: 2016-8-8 11:16

回复 11# xxpinqz

你好,要输出完整路径,因为代码通用,能用在其他地方,现在是检查jpg后缀的图片,四楼代码符合要求,如果能修改成 直接读取 文件列表.txt就好了。
作者: pcl_test    时间: 2016-8-8 13:55

回复 10# kaze

4楼已改
作者: kaze    时间: 2016-8-8 18:50

回复 13# pcl_test

谢谢,我加了几句,发现可以用,很好,
但是最后两句话貌似要改成:
WSH.echo('不符合--------------------------\r\n'+s1+'\r\n缺号的--------------------------\r\n'+s2);fso.CreateTextFile('处理结果.txt', 2).Write(s1+'\r\n'+s2);
你看对不对呢?
作者: pcl_test    时间: 2016-8-8 18:54

回复 14# kaze

嗯,自己看着办吧,我这样补上去不是没有原因的
作者: kaze    时间: 2016-8-8 21:14

回复 15# pcl_test
谢谢,我又用我的其他文件测试了一遍,符合要求!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2