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

[文本处理] [已解决]删除大小和类型一样的文件的批处理如何优化?

  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. for /f "tokens=*" %%a in ('dir/a-d/b/oe') do s?et/a c+=1&set a!c!=%%a&set b!c!=%%~za&set c!c!=%%~xa
  4. for /l %%a in (1,1,%c%) do set/a d=%%a+1&for /l %%b in (!d!,1,%c%) do if not !b%%a!.==. call :1 %%a %%b
  5. goto :eof
  6. :1
  7. if !b%1!==!b%2! if !c%1!==!c%2! set b%2=&del "!a%2!"
  8. goto :eof
复制代码
上面的那段代码功能是 用批处理实现删除大小和类型一样的文件的代码。
我有10000多的文件夹 在其目录下执行。
问题点。1.执行起来比较慢。有什么方法能优化一下?比如将10000多文件排序每500百个执行一下上面的程序?还有别的好方法吗?
        2.第三行中的[if not !b%%a!.==. call :1 %%a %%b ]代码中的[.==. ]与下面的调用是什么关系?不明白这个符号什么意思?
          小弟我是菜鸟,没看明白 请高人指点迷津?
        3.7行的【set b%2=&del "!a%2!" 】代码中的【=&】是什么意思?没看明白 请高人指点迷津?

是这样分的:
【set b%2=】&【del "!a%2!" 】

TOP

本帖最后由 weichenxiehou 于 2011-3-27 09:41 编辑

如果我理解没错的话,应该是你有些文件夹有10000多个文件吧?
1.原代码的思路是每一个文件和它之后的每一个文件进行对比,可以考虑从只和扩展名一样的文件进行对比这方面进行优化。
2.什么情况下!b%%a!.==. 呢?当然是!b%%a!预处理时为空啊,也就是说b%%a这个变量没有定义的时候,没多大用途,因为上面是肯定定义了这个变量的,加上是为了避免系统运行出错时发生意外的情况吧。
3.=&不能单独拿出来理解,&是命令连接符,用于连接两条命令,执行完前面的再执行后面的,也就是说这一句可以拆分成两条命令,和下面的相同:
  1. if !b%1!==!b%2! if !c%1!==!c%2! (
  2. set b%2=
  3. del "!a%2!"
  4. )
复制代码
看得多说得多,远比不上写得多。

TOP

本帖最后由 tmplinshi 于 2011-3-27 12:47 编辑
  1. @echo off
  2. for %%a in (*) do (
  3.     if not defined %%~xa%%~za (
  4.         set %%~xa%%~za=1
  5.     ) else (
  6.         del /f /a "%%a"
  7.     )
  8. )
复制代码
如果要处理的文件有跟批处理一样的后缀名,最好用以下代码:
  1. @echo off
  2. rem 功能:
  3. rem     批处理所在目录下,大小和后缀相同的文件只保留 1 个,其余删除。
  4. rem 复制自身到临时目录中运行,以防止出现与本批处理一样大小的批处理。
  5. if "%~1" neq "?Moved?" (
  6.     copy "%~f0" "%temp%" >nul
  7.     start "" /d "%~dp0" /b "%temp%\%~nx0" ?Moved?
  8.     exit /b
  9. )
  10. for %%a in (*) do (
  11.     if not defined %%~xa%%~za (
  12.         set %%~xa%%~za=1
  13.     ) else (
  14.         del /f /a "%%a"
  15.     )
  16. )
  17. copy "%temp%\%~nx0" >nul
  18. exit
复制代码

TOP

4# tmplinshi
版主的代码就是短小精悍啊!
看得多说得多,远比不上写得多。

TOP

  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. for /f "tokens=*" %%a in ('dir/a-d/b/oe') do set/a c+=1&set a!c!=%%a&set b!c!=%%~za&set c!c!=%%~xa
  4. for /l %%a in (1,1,%c%) do set/a d=%%a+1&for /l %%b in (!d!,1,%c%) do if not !b%%a!.==. call :1 %%a %%b
  5. goto :eof
  6. :1
  7. if !b%1!==!b%2! if !c%1!==!c%2! set b%2=&del "!a%2!"
  8. goto :eof
复制代码
感谢3.4楼主的回答。第三点小弟我明白了。第二点把他当成防止出错的链接符号就可以了是不
还想问下。
【for /f "tokens=*" %%a in ('dir/a-d/b/oe') do set/a c+=1&set a!c!=%%a&set b!c!=%%~za&set c!c!=%%~xa 】的语句中
小弟目录中有10000多个 类型一样为JPG的文件 我上面的此代码中加入
如果文件小于100k的话就执行下段代码,删除文件。
然后再手动改写小于200k的在执行,删除文件。
这样的代码怎么写呀。能把文件的大小提出来吗?进行if判断吗?
目的为了节省循环时间。10000多个文件在里面循环要等好久。

TOP

请高人指点 。谢谢各位的耐心回答。十分感谢。

TOP

本帖最后由 tmplinshi 于 2011-3-27 12:26 编辑

6# happy_ken6688
  1. @echo off
  2. set /a size = 100 * 1024
  3. for %%a in (*) do (
  4.     if not defined %%~xa%%~za (
  5.         set %%~xa%%~za=1
  6.     ) else (
  7.         if %%~za lss %size% del /f /a "%%a"
  8.     )
  9. )
复制代码
用这个代码。比你那个快很多的。
1

评分人数

TOP

好的 谢谢。

TOP

返回列表