找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24757|回复: 5

[文本处理] 按列表txt重命名文件的批处理不成功,请高手指正,谢谢!

[复制链接]
发表于 2024-4-1 19:38:34 | 显示全部楼层 |阅读模式
按文件名列表new_filenames.txt重命名当前目录及其子目录下所有文件的文件名,均不成功,请高手指正,谢谢!

文件列表new_filenames.txt中的文件名无论写成:
新文件名1.pdf
新文件名2.pdf
......
还是写成:
新文件名1.pdf,旧文件名.jpg
新文件名2.pdf,旧文件名.jpg
......

代码①和代码②都不能实现重命名
-------------------------------------------
代码②:
代码无效,没有执行如何操作
  1. @echo off
  2. chcp 65001
  3. cd /d "%~dp0"
  4. setlocal enabledelayedexpansion
  5. :: 假设我们要处理当前目录下的所有文件
  6. for %%F in (*) do (
  7.     set "filename=%%~nxF"
  8.     echo 文件名: !filename!
  9.     REM 在这里可以使用变量"filename"
  10.     setlocal enabledelayedexpansion
  11.     for /f "tokens=1,* delims=" %%a in ("new_filenames.txt") do (
  12.          rem 检查 %%a 是否对应 !filename!,以避免重命名错误
  13.          if "%%~a"=="!filename!" (
  14.              ren "!filename!" "%%b"
  15.          )
  16.     )
  17.     endlocal
  18. )
  19. endlocal
  20. pause
复制代码
--------------------------------------------------------------
代码①:
rem 文件名列表放在其它当前目录(bat同目录)重命名就不成功
  1. @echo off
  2. chcp 65001
  3. cd /d "%~dp0"
  4. setlocal enabledelayedexpansion

  5. :: 假设我们要处理当前目录下的所有文件
  6. for %%F in (*) do (
  7.     set "filename=%%~nxF"
  8.     echo 文件名: !filename!
  9.     REM 在这里可以使用变量"filename"
  10.     setlocal enabledelayedexpansion
  11.     cd /d "%~dp0"
  12.     for /f "tokens=1,* delims=" %%a in (new_filenames.txt) do (
  13.          set "filen=%%a"
  14.          ren "!filen!" "!filename!"
  15.     )
  16. )
  17. endlocal
  18. pause
复制代码
发表于 2024-4-1 21:15:46 | 显示全部楼层
  1. @echo off
  2. rem 批处理和文本全部保存为ansi编码格式
  3. for /f "useback tokens=1-2 delims=," %%a in ("1.txt") do (
  4.         for /r %%i in (%%a?) do (
  5.                 if "%%~nxi" equ "%%a" (
  6.                         ren "%%i" "%%b"
  7.                 )
  8.         )
  9. )
  10. pause
  11. exit
  12. 1.txt 格式
  13. 旧文件名,新文件名
  14. a.txt,b.txt
复制代码
发表于 2024-4-1 21:41:59 | 显示全部楼层
编码全部保存成ansi
新旧文件名用英文?分割
例如:
新文件名1.pdf?旧文件名.jpg
新文件名2.pdf    ?     旧文件名.jpg

  1. @echo off&pause

  2. for /f "usebackq eol=/ tokens=1,2,3 delims=?" %%a in ("new_filenames.txt") do (
  3. setlocal
  4. set _@new=%%a
  5. set _@old=%%b
  6. if "%%c" neq "" set _@old=

  7. if defined _@old (

  8. setlocal enabledelayedexpansion
  9. if "!_@new:~0,1!" == " " (
  10. for /f "tokens=1,* delims= " %%x in ("?!_@new!") do endlocal&set _@new=%%~y
  11. ) else endlocal

  12. setlocal enabledelayedexpansion
  13. if "!_@old:~0,1!" == " " (
  14. for /f "tokens=1,* delims= " %%x in ("?!_@old!") do endlocal&set _@old=%%~y
  15. ) else endlocal

  16. setlocal enabledelayedexpansion
  17. for %%z in ("!_@new!") do endlocal&set _@new=%%~nxz

  18. setlocal enabledelayedexpansion
  19. for %%z in ("!_@old!") do endlocal&set _@old=%%~nxz

  20. setlocal enabledelayedexpansion
  21. if exist "!_@old!" (
  22. if not exist "!_@new!" (
  23. echo rename "!_@old!" to "!_@new!"
  24. rename "!_@old!" "!_@new!"
  25. ) else (echo 存在跟新文件名"!_@new!"同名的文件 : 不处理
  26. )
  27. ) else (echo 警告 : 需要改名的文件"!_@old!"不存在
  28. )
  29. endlocal

  30. ) else ( call echo 错误 : 当前行格式不正确
  31. )
  32. endlocal
  33. )
  34. pause
复制代码
 楼主| 发表于 2024-4-3 02:21:40 | 显示全部楼层
[quote][/quote] 感谢二位高手的回复,辛苦了!谢谢!
2楼77七 代码需要添加一行,在第二个for语句后面添加 echo, "%%i"一行,就实现该功能。
3楼代码也非常不错的。
 楼主| 发表于 2024-4-3 02:32:04 | 显示全部楼层
回复 2# 77七
感谢高手的回复,辛苦了!谢谢!
2楼77七 代码需要添加一行,在第二个for语句后面添加 echo, "%%i"一行,你可测试一下。
 楼主| 发表于 2024-4-3 02:37:07 | 显示全部楼层
回复 3# Five66

[quote][/quote] 感谢二位高手的回复,辛苦了!谢谢!
3楼代码也非常不错的。一次成功。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 02:44 , Processed in 0.014850 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表