Board logo

标题: [文件操作] [已解决]求助完善按指定格式批量重命名文件的批处理代码 [打印本页]

作者: fengzhengfeng    时间: 2016-3-21 11:55     标题: [已解决]求助完善按指定格式批量重命名文件的批处理代码

我希望能实现将文件所在目录名和连接符加在文件名前的功能,但是实际处理中处理的次数比文件多,比如文件夹下有3个文件(分别为1.ogg,2.ogg,3.ogg),批处理应该处理3次,但是实际上处理了4次,有个文件被加了2次的目录名和连接符,如图:

我想知道我的批处理哪里写错了,应该要怎么改?

另外如果增加一个判断文件名中包含目录名,如果包含则不执行改名,这个该怎么改呢?谢谢!

以下是我写的批处理。
  1. @ECHO OFF
  2. setlocal enabledelayedexpansion
  3. ECHO 本批处理文件用来将文件所在目录名和连接符加在文件名前。
  4. :: 将文件所在目录名和连接符加在文件名前。
  5. ECHO=
  6. ECHO 本批处理默认设置为将ogg文件所在目录名和连接符a加在文件名前。
  7. ECHO 本批处理将依次分步执行以下命令:
  8. ECHO 1、设置文件扩展名。
  9. ECHO 2、设置连接符。
  10. ECHO 3、开始重命名,公式为:新文件名=目录名+连接符+原文件名。
  11. ECHO=
  12. SET /p All=是否使用默认设置?(Y/N):
  13. IF %All% EQU Y (
  14. GOTO AllY
  15. ) ELSE (
  16. GOTO AllN
  17. )
  18. :AllY
  19. SET Extension=ogg
  20. SET Connector=a
  21. SET RenCommand=Y
  22. GOTO Start
  23. :AllN
  24. SET Extension=""
  25. SET Connector=""
  26. SET RenCommand=""
  27. GOTO Start
  28. :Start
  29. :: 1、设置文件扩展名。
  30. IF %All% NEQ Y (
  31. SET /p Extension=请输入文件扩展名:
  32. )
  33. :: IF "%Extension%" EQU "ogg" (
  34. :: )
  35. :: 2、设置连接符。
  36. IF %All% NEQ Y (
  37. SET /p Connector=请输入连接符:
  38. )
  39. :: IF "%Connector%" EQU "a" (
  40. :: )
  41. :: 3、开始重命名,公式为:新文件名=目录名+连接符+原文件名。
  42. IF %All% NEQ Y (
  43. SET /p RenCommand=是否开始重命名?(Y/N):
  44. )
  45. IF %RenCommand% EQU Y (
  46. FOR /R %%a IN (*.%Extension%) DO (
  47.         FOR %%b IN ("%%a\..") DO (
  48.                 ECHO 重命名公式为:新文件名=目录名+连接符+原文件名。
  49.                 ECHO 重命名路径:%%a
  50.                 REN "%%a" "%%~nxb%Connector%%%~nxa"
  51.                 ECHO ----------------------------------------------------------------------
  52.                 )
  53.         )
  54. )
  55. PAUSE
复制代码

作者: happy886rr    时间: 2016-3-21 12:32

本帖最后由 happy886rr 于 2016-3-21 12:34 编辑

回复 1# fengzhengfeng

批处理名为其他名时,重新附加新路径到文件名上。当你将批处理命名为 还原.bat 时,它就还原所有子目录ogg为原始名。
连接符自己替换里边的▼
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 还原名称中...
  4. for /f "tokens=1,2 delims=▼" %%a in ('dir /s /b *.ogg^|find "▼"') do (
  5. ren "%%a▼%%b" "%%b"
  6. )
  7. if "%~n0"=="还原" (goto end)
  8. echo 重新命名中...
  9. for /f "delims=" %%a in ('dir /s /b *.ogg') do (
  10. set "pre=%%~pa"
  11. ren "%%a" "!pre:\=丨!▼%%~nxa"
  12. )
  13. :end
  14. echo 执行完毕!!!
  15. pause>nul
复制代码

作者: fengzhengfeng    时间: 2016-3-23 10:40

回复 2# happy886rr
谢谢,看到你的代码想到用FOR /F也能实现所以把
  1. FOR /R %%a IN (*.%Extension%) DO (
复制代码
改成
  1. FOR /F "delims=" %%a IN ('dir /a-d /b /s *.%Extension%') DO (
复制代码
就不会同个文件处理几次了。不过我还是不明白
  1. FOR /R %%a IN (*.%Extension%) DO (
复制代码
哪里有问题,请问能帮忙解答一下吗?
作者: WHY    时间: 2016-3-23 11:04

回复 3# fengzhengfeng


    [50条]不能说的秘密-CMD命令奇诡语法特性汇集
看这里:

示例:
echo 1 > 1.txt & echo 2 > 2.txt
for %%f in (*.txt) do ren %%f f-%%f

效果:生成两个文件f-2.txt和f-f-1.txt ,1.txt 被改名后再次被改名
注释:在for 语句内使用ren 要谨慎,f-可以改为任意以字母开头的字符串


for /r 与 for 一样
作者: fengzhengfeng    时间: 2016-3-23 11:40

回复 4# WHY
非常感谢!以后还是用FOR /F好了,不过为什么系统只对其中一个文件或几个文件多次重命名而不是全部文件呢?这里面系统的判断机制是什么呢?
作者: WHY    时间: 2016-3-23 13:26

回复 5# fengzhengfeng


    你可以认为这是CMD的一个bug,知道有这么回事,以后尽量避免就是了,没有必要去深究原因(其实我也不知道原因^_^)

什么时候用 for,什么时候用 for /f + dir,可以参考下:
批处理for语句从入门到精通 6楼
作者: fengzhengfeng    时间: 2016-3-23 14:04

回复 6# WHY
再次感谢,那篇文章前天看了,受益匪浅呢。




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