Board logo

标题: [文本处理] [已解决]批处理如何把txt文本按照顺序把没有的修改递补上? [打印本页]

作者: wslqy    时间: 2011-7-17 14:13     标题: [已解决]批处理如何把txt文本按照顺序把没有的修改递补上?

问个问题,一个文件夹里面有1---200左右的文本,1.txt,2.txt,5.txt......,如何按照顺序把没有的修改递补上:1.txt,2.txt,3.txt,也就是说,把5.txt的递修改为3.txt以此类推
作者: 0428_hai    时间: 2011-7-17 14:20

  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. ::本批处理功能为将当前文件夹下所有以阿拉伯数字命名的文本文件“按序”排列
  4. ::注意事项:当前文件夹中的文本文件名必须为阿拉伯数字,数字之间不允许空格
  5. ::当然可以根据自己的需求继续完善
  6. set max=1
  7. for %%a in (*.txt) do (
  8. set %%~na=%%~na
  9. if !max! lss %%~na set max=%%~na
  10. set /a cnt+=1
  11. )
  12. for /l %%a in (1,1,%cnt%) do (
  13. if defined %%a (
  14. set %%a=
  15. ) else (
  16. set _tmp=%%a
  17. call :reName %%a
  18. )
  19. )
  20. echo done......
  21. pause>nul
  22. exit
  23. :reName
  24. for /l %%a in (1,1,%max%) do (
  25. set /a _tmp+=1
  26. if defined !_tmp! (
  27. echo ren !_tmp!.txt %1.txt
  28. set !_tmp!=
  29. pause>nul
  30. goto :eof
  31. )
  32. )
复制代码

作者: wslqy    时间: 2011-7-17 14:21

多谢0428_hai 大师的帮助
作者: CUer    时间: 2011-7-17 14:21

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set num=1000
  4. for /f %%a in ('dir /b *.txt') do (
  5.     set /a num+=1
  6.     ren %%a !num!.txt
  7. )
  8. for /f %%a in ('dir /b *.txt') do (
  9.     set /a newname=%%~na%%1000
  10.     ren %%a !newname!.txt
  11. )
复制代码

作者: wslqy    时间: 2011-7-17 14:27

CUer 的代码文本名称是可以改变,但文本的时间属性被重新排列了
作者: CUer    时间: 2011-7-17 14:30

5# wslqy


没看到你顶楼有这个需求啊
作者: wslqy    时间: 2011-7-17 14:31

不过还是要感谢大家对我的帮助,再次谢谢大家
作者: wslqy    时间: 2011-7-17 14:33

不好意思,无法把要的结果截图到这里面来,非常抱歉
作者: ArdentMan    时间: 2011-7-17 14:38

  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /F "delims=" %%i In ('Dir /od /b *.txt') Do (
  3.   If Not Defined Num (
  4.     Set /A Num=%%~ni
  5.     ) Else (
  6.     Set /A Num+=1
  7.     If !Num! NEQ %%~ni Ren %%i !Num!.txt
  8.   )
  9. )
复制代码

作者: wslqy    时间: 2011-7-17 14:42

不是像我刚刚截图要的结果
作者: wslqy    时间: 2011-7-17 14:45

2楼和9楼使用效果都一样,很好很不错
作者: wslqy    时间: 2011-7-17 14:54

所有的问题已经解决,再次谢谢各位大师
作者: 0428_hai    时间: 2011-7-17 14:57

如下图所示,不知为何我测试时,程序最后把编号编到242了,而我的txt文本只有50个啊
作者: ArdentMan    时间: 2011-7-17 15:15

13# 0428_hai
是因为你最小序号的文本文件的创建时间不是最早的~~~~
作者: 0428_hai    时间: 2011-7-17 15:49

是的。
对于楼主的实际应用,看来用dir/o-d的排序效果就达到要求了。
我用于测试所创建的文本文件创建时间几乎全都一样吧,对于实际情况没有什么意义了。
只是对于这种“特殊情况”不适用罢了
作者: mxxcgzxxx    时间: 2011-7-17 16:48

本帖最后由 mxxcgzxxx 于 2011-7-17 17:37 编辑

测试可用,只修改文件名为纯数字的文件,别的无视
修正数字排序错误问题
只按数字改名不按修改时间
可更改 hz参数来改变后辍
允许最大文件名8999,如果有需要可以改第五句的1000成10000就可以允许89999
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set hz=txt
  4. for /f %%1 in ('dir /on /b * ^| findstr "^[0-9]*.%hz%$"') do (
  5.        set /a a=1000+%%~n1
  6.        set x!a!=%%1
  7.        )
  8. set a=1
  9. for /f "tokens=2 delims==" %%1 in ('set x') do (
  10.        ren %%1 !a!.%hz%
  11.        set /a a+=1
  12.        )
  13. echo 转换完成
  14. pause>nul  
复制代码

作者: wslqy    时间: 2011-7-17 20:47

已经结贴,谢谢大家的关注
作者: mxxcgzxxx    时间: 2011-7-18 13:47

18# else


只用DIR是不行,我的程序要+1000就是为了防止文件名读取错误
因为系统读数字文件名时是:1,10,11,12,13...19,2,20,21...的顺序,如果这些文件是有一定顺序的重要数据文件就会被全打乱了




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