Board logo

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

作者: WBATW    时间: 2024-4-1 19:38     标题: 按列表txt重命名文件的批处理不成功,请高手指正,谢谢!

按文件名列表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
复制代码

作者: 77七    时间: 2024-4-1 21:15

  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
复制代码

作者: Five66    时间: 2024-4-1 21:41

编码全部保存成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
复制代码

作者: WBATW    时间: 2024-4-3 02:21

[quote][/quote] 感谢二位高手的回复,辛苦了!谢谢!
2楼77七 代码需要添加一行,在第二个for语句后面添加 echo, "%%i"一行,就实现该功能。
3楼代码也非常不错的。
作者: WBATW    时间: 2024-4-3 02:32

回复 2# 77七
感谢高手的回复,辛苦了!谢谢!
2楼77七 代码需要添加一行,在第二个for语句后面添加 echo, "%%i"一行,你可测试一下。
作者: WBATW    时间: 2024-4-3 02:37

回复 3# Five66

[quote][/quote] 感谢二位高手的回复,辛苦了!谢谢!
3楼代码也非常不错的。一次成功。




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