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

[文件操作] 批处理将文件以数字重命名

讨论:将文件以数字重命名
看似简单,其实不然。
现有a.txt文件内容如下,一行一个文件名。路径为当前目录。
要求:
   1、不能改变a.txt内容的顺序
   2、将当前目录下的所有jpg文件以序号的形式重命名 如:从1-16

   3、如果有16个文件,必须重命名为1-16,不允许出现16之后的序号

暂不公布我的代码,各位不防先试试。
a.txt 内容:
  1. 2.jpg
  2. 1.jpg
  3. a.jpg
  4. 5ww.jpg
  5. c.jpg
  6. f.jpg
  7. rty.jpg
  8. 3.jpg
  9. 11.jpg
  10. b.jpg
  11. 6.jpg
  12. e.jpg
  13. 8.jpg
  14. 111.jpg
  15. 7.jpg
  16. 30.jpg
复制代码


重新描述一下要求:
当前文件夹有一万多个jpg文件,文件名没有规律,有数字,英文,中文、及中英文混合。
要求:
   将jpg文件以数字形式重命名,必须是从1开始递增,即:最大的一个文件名就是文件的总数。
   要求效率,即:不能先判断文件的总数,再重命名。


[ 本帖最后由 随风 于 2008-6-10 23:55 编辑 ]
技术问题请到论坛发帖求助!

  没有看明白你的意思:是从a.txt中读取jpg文件名来重命名当前目录下的文件?a.txt只是一个单独的文件,如何有顺序一说?
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

a.txt中的内容其实就是当前文件夹下的jpg文件列表。
要求将当前文件夹里的所有jpg文件以序号的形式重命名。
但只能从 a.txt 获取当前文件夹里的所有 jpg 的文件名。
以序号重命名文件,陷阱重重,但如果用dir或for等命令来获取文件名的话,获取的先后次序会有一定规律,导致有些问题不能体现出来。
技术问题请到论坛发帖求助!

TOP

  随风 是担心重命名后文件名可能和现有文件名重名是吧?但是我始终没明白你"不能改变a.txt的顺序
"到底是什么意思:a.txt只是一个单独的文件,没看到它到底和谁排序呢?难道是不能改变a.txt文件内容的顺序?
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

不知道以下代码是不是投机:
  1. @echo on
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. set n1=0
  5. for /f "tokens=*" %%a in (a.txt) do (
  6.      set /a n+=1
  7.      ren %%a t!n!.jpg
  8.     )
  9. :loop
  10. set /a n1+=1  
  11. ren t%n1%.jpg %n1%.jpg&&goto :loop
  12. exit
复制代码
1

评分人数

Welcome back to the world, grab a spoon - old friends

TOP

呵呵,个人认为算投机。。
不过也不错,也是一个解决方法

[ 本帖最后由 随风 于 2008-6-11 16:53 编辑 ]
技术问题请到论坛发帖求助!

TOP

我有两个版本。第一个:
  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do set/a n+=1
  3. for /f "delims=" %%i in (a.txt) do (
  4.   for /l %%j in (1,1,%n%) do if %%~ni equ %%j set .%%j=ok
  5. )
  6. for /f "delims=" %%i in (a.txt) do (
  7.   if not defined .%%~ni call :out %%i
  8. )
  9. pause
  10. :out
  11. for /l %%i in (1,1,%n%) do (if not defined .%%i (ren %1 %%i.jpg&set .%%i=ok&goto :eof))
复制代码
第二个更简单:
  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do set/a n+=1
  3. for /f "delims=" %%i in (a.txt) do call :out %%i
  4. pause
  5. :out
  6. for /l %%i in (1,1,%n%) do (ren %1 %%i.jpg 2>nul&&goto :eof)
复制代码

TOP

呵呵,强免完成任务。
两个版本的效率都非常的低。。









..
技术问题请到论坛发帖求助!

TOP

暂时没想出很简洁的方法,再思考思考..........

TOP

再来一个,效率要比前两个要好:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%i in (a.txt) do (set/a n+=1&set .!n!=ok)
  3. for /f %%i in (a.txt) do (
  4.   if not defined .%%~ni (set/a n1+=1&set name!n1!=%%i
  5.   ) else (set .%%~ni=)
  6. )
  7. for /l %%i in (1,1,%n%) do (if defined .%%i (set/a n2+=1&set num!n2!=%%i))
  8. for /l %%i in (1,1,%n1%) do ren !name%%i! !num%%i!.jpg
复制代码

TOP

首先:效率仍是问题。
10 楼测试过吗?


代码绕的我好晕。。。

[ 本帖最后由 随风 于 2008-6-10 21:51 编辑 ]
技术问题请到论坛发帖求助!

TOP

10楼测试过,代码虽然多,但都是for和if,不过也只能说比前面的快点。测试了几次,平均耗时0.03秒。
思路是将a.txt中 范围数字 之外的名称装进一个数组,再将剩余a.txt中没用过的数字装进一个数组,再一一对应重命名。

[ 本帖最后由 wankoilz 于 2008-6-10 23:32 编辑 ]

TOP

见顶楼红色字部分,再试试。。。
技术问题请到论坛发帖求助!

TOP

测试1000个文件用了2.8秒,10000个不敢测试了。发现太多的set很耗时间........
再思考思考................

[ 本帖最后由 wankoilz 于 2008-6-11 00:32 编辑 ]

TOP

想给想得太简单了,呵呵……

[ 本帖最后由 lovelymorning 于 2008-6-11 16:36 编辑 ]

TOP

返回列表