回复 15# awei [/b
嗯嗯,那么就需要检测当前文件夹下共有哪种格式的文件了,不过,你的这个文件名后缀并不合法;
建议你这样,如果文件夹下的几种格式不是特别多,能够列出来的话
比如 *.jpg* *.bmp* *.gif* 等。
你看到上面发的那串代码了吗
你只要在:- pushd "%%~fsi"&call :a "*.jpg*" "*.bmp*" "*.gif*"
复制代码
添加你想要删除的扩展名格式就行了。注意,中间有一个空格,你可以测试一下,应该会符合的你的要求。
作者: xxpinqz 时间: 2015-1-10 12:54
自己复制一些文件测试下:- @echo off&setlocal enabledelayedexpansion
- set ext="*.jpg.* *.bmp.*"
- (for /f "delims=" %%a in ('dir /b/s "%ext%"^|findstr /e ".[0-9]"') do (
- set "str=000000%%~xa"
- echo,%%~dpna/!str:~-8!
- ))>tmp
- for /f "tokens=1-2 delims=/" %%a in ('sort tmp') do (
- if "%%a"=="!file!" (
- del /q "%%a%%~xb"
- ) else (
- set "file=%%a"
- )
- )
- del tmp
复制代码
作者: awei 时间: 2015-1-10 13:57
回复 16# 慕夜蓝化
试过了你的代码,发现如下问题:
1.当前文件夹文件没有删除,只作用于子文件夹
2.同时存在两种不同格式文件时,会作出比较,然后保留了相同序号的文件,这是其中一个格式有用,另一个却又无效。
3.相同的几个文件,继续执行BAT,则保留了相同的小序号的文件,大的序号则删除了。
作者: awei 时间: 2015-1-10 14:02
本帖最后由 awei 于 2015-1-10 14:22 编辑
回复 17# xxpinqz
测试过后,发现了两个问题:
1.后缀最大序号为82
如果小于82的序号,则可以实现功能
如果大于82,则会被删除。
通常来说,这个序号是可以无限大的,但,由于经常性的清理旧版本文件,所以,这个数一般也不会太过离谱,但,在三五千以下就比较保险了。^-^
2.各种文件(我测试了三种,而且,我至少需要三种),会按照其中序号相同的来排序,而且是保留序号小的文件,其它文件都删除
请大神修正,谢谢~!
作者: awei 时间: 2015-1-10 14:36
回复 17# xxpinqz
回复 2# pcl_test
回复 3# 545810831
回复 13# 慕夜蓝化
我修改了规则,前面说得不够清晰,抱歉:
现在有很多软件操作,每保存一次文件,就会重新生成一个新的文件,文件名是一样的,但是,在后缀后面会自动增加一个数字序号,用来表示此文件的修改版本
往往文件完成后,会产生大量的前期版本文件,求一个一次性操作删除旧版本文件的BAT。
如:*.jpg.1 *.jpg.2 *.jpg.3 *.bmp.1 *.bmp.2 *.bmp.3 *.gif.1 *.gif.2 *.gif.3 ........
执行批处理后,所有文件夹及子文件夹,只保留最后的一个版本的文件,如*.jpg.3 *.bmp.3 *.gif.3
如果,文件夹中只有一个文件,同样保留,如,只有*.jpg.1,那么,保留。
但是,删除文件的提前是只在当前文件夹中作比较,也就是说,在不同的文件夹中,可能会有同名文件,不作统一的比较,只在本文件夹中保留同名文件的最后一个版本。
也就是说:
1.各个文件夹相对独立,不和其它文件夹作比较
2.相同文件夹下的不同格式及不同名称文件,不和其它格式及不同名称文件作比较,即00.jpg.*不会和00.bmp.*不会和00.gif.*作比较
谢谢~!
作者: apang 时间: 2015-1-10 14:38
本帖最后由 apang 于 2015-1-10 14:51 编辑
如果回显结果正确,删除第3行的 echo- @set @n=0;/* & echo off
- for /f "tokens=1*" %%a in ('dir /b^|cscript -nologo -e:jscript "%~0"') do (
- echo,Del "%%b"
- )
- pause & exit/b & rem */
-
- dic = new ActiveXObject("Scripting.Dictionary");
- while (!WScript.StdIn.AtEndOfStream) {
- f = WScript.StdIn.ReadLine();
- m = f.match(/.+\.(.+?)\.(\d+)$/);
- if (m) {
- k = m[1].toLowerCase();
- m[2] = ("0000000000" + m[2]).substr(m[2].length);
- if (dic.Exists(k)) {
- dic.Item(k) += "\n" + m[2] + " " + m[0];
- } else dic.Add(k, m[2] + " " + m[0])
- }
- }
-
- arr = (new VBArray(dic.Keys())).toArray();
- for (i=0; i<arr.length; i++) {
- a = dic(arr[i]).split("\n").sort().slice(0, -1);
- WScript.Echo(a.join("\n"))
- }
复制代码
作者: awei 时间: 2015-1-10 15:09
回复 21# apang
测试过发现两个问题:
1.只作用于当前文件夹,无法作用子文件夹
2.自动检测后缀功能非常好,不过,似乎有点乱,相同后缀,但不同名称的文件,只保留了其中之一,而且不固定是哪一个。
作者: apang 时间: 2015-1-10 15:51
本帖最后由 apang 于 2015-1-10 16:39 编辑
回复 22# awei
试试:- @set @n=0;/* & echo off
- set "Js=cscript -nologo -e:jscript"
- pushd "D:\Test\"
- for /f "tokens=1*" %%a in ('dir /a-d /b /s ^| %Js% "%~0"') do (
- echo,Del "%%b"
- )
- pause & exit/b & rem */
-
- dic = new ActiveXObject("Scripting.Dictionary");
- while (!WScript.StdIn.AtEndOfStream) {
- f = WScript.StdIn.ReadLine();
- m = f.match(/(.+\..+?)\.(\d+)$/);
- if (m) {
- k = (m[1]).toLowerCase();
- m[2] = ("000000000000" + m[2]).substr(m[2].length);
- if (dic.Exists(k)) {
- dic.Item(k) += "\n" + m[2] + " " + m[0];
- } else dic.Add(k, m[2] + " " + m[0])
- }
- }
-
- arr = (new VBArray(dic.Keys())).toArray();
- for (i=0; i<arr.length; i++) {
- a = dic(arr[i]).split("\n");
- if (a.length > 1) {
- WScript.Echo(a.sort().slice(0, -1).join("\n"))
- }
- }
复制代码
作者: awei 时间: 2015-1-10 16:11
回复 23# apang
DOS界面第一句提示系统找不到路径,然后下面则是显示删除的文件清单,但是,退出后,文件并没有被删除,同时也不作用于子文件夹。谢谢~!
作者: apang 时间: 2015-1-10 16:19
回复 24# awei
第3行路径改成实际路径
作者: awei 时间: 2015-1-10 16:47
回复 25# apang
嗯,一开始没注意到有个路径,不过,还是没有删除文件,虽然有显示。
作者: apang 时间: 2015-1-10 17:26
回复 26# awei
显示结果正确不?
正确的话,删掉多余的echo, 再次运行即可
作者: awei 时间: 2015-1-10 17:31
回复 27# apang
嗯嗯,可以,暂时没有发现错误,请加上同时子文件夹的功能,谢谢~!周末愉快~!!!
作者: apang 时间: 2015-1-10 18:23
回复 28# awei
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利
C:\Windows\System32>cd /d D:\Test\
D:\Test>dir /b/s | findstr \.[0-9][0-9]*$
D:\Test\new.JPG.1
D:\Test\new.doc.11
D:\Test\file2.txt.12
D:\Test\new.doc.100
D:\Test\new.jpg.21
D:\Test\file2.txt.2
D:\Test\new.jpg.25
D:\Test\b.txt.1
D:\Test\abc\NEW.JPG.1
D:\Test\abc\new.DOC.1
D:\Test\abc\new.jpg.99
D:\Test\abc\new.doc.100
D:\Test\abc\new.jpg.10
D:\Test>Test.bat
Del "D:\Test\new.JPG.1"
Del "D:\Test\new.jpg.21"
Del "D:\Test\new.doc.11"
Del "D:\Test\file2.txt.2"
Del "D:\Test\abc\NEW.JPG.1"
Del "D:\Test\abc\new.jpg.10"
Del "D:\Test\abc\new.DOC.1"
请按任意键继续. . .
亲测,处理子文件夹没有问题
作者: pcl_test 时间: 2015-1-10 21:55
回复 apang
嗯嗯,可以,暂时没有发现错误,请加上同时子文件夹的功能,谢谢~!周末愉快~!! ...
awei 发表于 2015-1-10 17:31
把apang在23楼的代码稍微改下即可- @set @n=0;/* & echo off
- set "Js=cscript -nologo -e:jscript"
- ::自行更换成实际路径
- pushd "E:\Test\"
- for /f "tokens=1*" %%a in ('dir /a-d /b /s ^| %Js% "%~0"') do (
- echo,删除文件"%%b"
- Del "%%b" /f /q
- )
- pause & exit/b & rem */
-
- dic = new ActiveXObject("Scripting.Dictionary");
- while (!WScript.StdIn.AtEndOfStream) {
- f = WScript.StdIn.ReadLine();
- m = f.match(/(.+\..+?)\.(\d+)$/);
- if (m) {
- k = (m[1]).toLowerCase();
- m[2] = ("000000000000" + m[2]).substr(m[2].length);
- if (dic.Exists(k)) {
- dic.Item(k) += "\n" + m[2] + " " + m[0];
- } else dic.Add(k, m[2] + " " + m[0])
- }
- }
-
- arr = (new VBArray(dic.Keys())).toArray();
- for (i=0; i<arr.length; i++) {
- a = dic(arr[i]).split("\n");
- if (a.length > 1) {
- WScript.Echo(a.sort().slice(0, -1).join("\n"))
- }
- }
复制代码
作者: awei 时间: 2015-1-11 08:56
回复 29# apang
回复 30# pcl_test
谢谢大神们!今天休息了,没有电脑测试,抱歉了,明天第一时间来测试!祝你们周末愉快!!!
作者: apang 时间: 2015-1-11 13:50
其实,17楼 xxpinqz 的思路非常不错,只是楼主不识货。
小改一下 :- @echo off & setlocal enabledelayedexpansion
- pushd "D:\test\"
- if "%1" == "OK" (
- for /f "delims=" %%a in ('dir /b/s^|findstr \.[0-9][0-9]*$') do (
- set "str=0000000000%%~xa"
- set "str=!str:.=!"
- echo,%%~dpna/!str:~-10!%%~xa
- )
- ) else (
- for /f "tokens=1*delims=/" %%a in ('"%~0" OK^|sort /r') do (
- if /i "%%a" == "!file!" (
- echo Del "%%a%%~xb"
- ) else set "file=%%a"
- )
- pause
- )
复制代码
作者: awei 时间: 2015-1-12 09:49
回复 32# apang
大神,实在是惭愧呀,我是完全不懂的外行,谢谢你们~!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |