标题: [文件操作] [已解决]批处理如何查找出前缀相同的文件名中数字后缀缺号的文件 [打印本页]
作者: 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 编辑
- /*&cls
- @echo off
- rem 如果是读取文本下句改为 type "文件列表.txt"|cscript -nologo -e:jscript "%~f0"
- (dir /a-d/b/s *-*.txt)|cscript -nologo -e:jscript "%~f0"
- pause&exit
- */
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var list = WSH.StdIn.ReadALL().split(/\r\n/), a={}, s1=s2='';
- for(var i=0; i<list.length; i++){
- if(!/\d+\.[^\.\\]+$/.test(list[i])){
- s1+=list[i]+'\r\n';
- }else{
- var fpath = list[i].replace(/\d+\.[^\.\\]+$/, '');
- var num = parseInt(fso.GetBaseName(list[i]).match(/\d+$/));
- var ext = '.'+fso.GetExtensionName(list[i]);
- var t = (fpath+'|'+ext).toLowerCase();
- if(!a[t]){
- a[t]={'max':num};
- }else{
- if(num>a[t]['max'])a[t]['max']=num;
- }
- a[t][num]=1;
- }
- }
- for(var b in a){
- var m = b.split('|');
- for(var i=1; i<=a[b]['max']; i++){
- if(!a[b][i]){s2+=(!m[0]?i:m[0]+i)+m[1]+'\r\n';}
- }
- }
-
- WSH.echo('不符合--------------------------\r\n'+s1+'\r\n缺号的--------------------------\r\n'+s2);
- //WSH.echo('缺号的--------------------------\r\n'+s2);fso.CreateTextFile('处理结果.txt', 2).Write(s2);
复制代码
作者: xxpinqz 时间: 2016-8-7 16:17
本帖最后由 xxpinqz 于 2016-8-7 16:39 编辑
忘了差不多了。。。。- @echo off&setlocal enabledelayedexpansion
- ::下一行50表示最大值,自己改
- for /l %%a in (50,-1,1) do set "c=!c!,%%a,"
- (for /f "delims=" %%a in ('dir /b/s *-*.txt') do (
- set "str=%%~na"
- set "str=!str:-=.1!"
- for /f "delims=" %%b in ("!str!") do (
- set "n=%%~xb"
- set/a "1/(!n:.=!-1)" && (
- if not defined #%%~nb (
- set #%%~nb=.
- if !max! gtr 0 for %%c in (!max!) do (
- set num=!num:*,%%c,=!
- if not "!num!"=="" echo,!file:.1=-!!num:,= !
- )
- set num=%c%
- set "file=%%~dpnb文件缺少:"
- set max=0
- )
- set n=!n:~2!
- for %%c in (!n!) do set num=!num:,%%c,=!&if %%c gtr !max! set/a max=1+%%c
- )||echo,%%a----错误
- )))2>nul
- if !max! gtr 0 for %%c in (!max!) do (
- set num=!num:*,%%c,=!
- if not "!num!"=="" echo,!file:.1=-!!num:,= !
- )
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |