Board logo

标题: [文件操作] [已解决]批处理如何替换文件夹名和文件名里的指定字符或字符串 [打印本页]

作者: akb4888    时间: 2015-3-29 22:10     标题: [已解决]批处理如何替换文件夹名和文件名里的指定字符或字符串

本帖最后由 pcl_test 于 2016-8-14 11:56 编辑

本人没有什么基础,就是突然喜欢上鼓捣批处理。自己胡搞瞎弄了一番。
  1. @echo off&color 3a&set c=0123456789abcdefghijklmnopqrstuvwxyz
  2. title 批量替换文件(文件夹)名
  3. echo.
  4. echo 此批处理可批量替换本文件所在文件夹下所有文件的文件名。
  5. echo.
  6. echo.&set /p strtemp1= 请输入要替换的文件(文件夹)名字符串(可替换空格):
  7. echo.&set /p strtemp2= 请输入替换后的文件(文件夹)名字符串(删除则直接回车):
  8. for /f "delims=" %%i in ('dir /s /b') do (
  9. setlocal enabledelayedexpansion
  10. set "f=%%~nxi"
  11. set "f1=!f:%strtemp1%=%strtemp2%!"
  12. if not "%%i"==%0 (     
  13. if not "!f!"=="!f1!" (
  14.          if exist "!f1!" (
  15.             echo 由于!f1!存在同名,!f! 文件名未改           ) else ren "!f!" "!f1!"
  16.      )  
  17.      endlocal
  18.   )
  19. )
复制代码
上面这段代码是我这几天在网上东拼西凑来的,
现在问题是:
1、不能把文件夹和文件的字符同时替换,网上查了下,好像是因为先把父文件夹的字符替换了,所以后面文件的路径就找不到了因此失效。如果要实现文件夹和文件同时替换,代码要怎么修改?
2、好像不能对!号等特殊字符开头的文件和文件夹进行替换,要怎么办?

如果2比较难实现,代码比较麻烦我这种水平也理解不了,可以告诉我问题1的解决方法吗?问题1目前比较重要……
谢谢大家!!新来的如果发帖有什么不对的地方还请包含。
作者: pcl_test    时间: 2015-3-30 00:37

本帖最后由 pcl_test 于 2015-3-30 10:21 编辑

回复 1# akb4888
  1. @echo off & color 3a & setlocal enabledelayedexpansion
  2. title 批量替换文件(文件夹)名
  3. echo 此批处理可批量替换本文件所在文件夹下所有文件(文件夹)名。
  4. echo.
  5. set /p str1= 请输入要替换的文件(文件夹)名字符串(可替换空格):
  6. set /p str2= 请输入替换后的文件(文件夹)名字符串(去除则直接回车):
  7. echo.
  8. echo 正在替换文件名……
  9. for /f "delims=" %%a in ('dir /a-d /s /b') do (
  10. if "%%~nxa" neq "%~nx0" (
  11. set "f=%%~na"
  12. set "f=!f:%str1%=%str2%!"
  13. if not exist "%%~dpa!f!%%~xa" ren "%%a" "!f!%%~xa"
  14. )
  15. )
  16. echo 替换文件名完成
  17. echo.
  18. echo 正在替换文件夹名……
  19. :folder
  20. set n=0
  21. for /f "delims=" %%i in ('dir /ad /s /b ^|find "%str1%"') do (
  22. set t=%%~ni
  23. set t=!t:%str1%=%str2%!
  24. if not exist "%%~dpi!t!" ren "%%i" "!t!" 2>nul
  25. set /a n+=1
  26. )
  27. if "!n!" neq "0" goto folder
  28. echo 替换文件夹名完成
  29. pause
复制代码

作者: CrLf    时间: 2015-3-30 00:54

本帖最后由 CrLf 于 2015-3-30 00:55 编辑

先文件和子文件再文件夹
  1. dir /s /b | sort /r
复制代码
  1. dir /s /b | sort /+65535
复制代码

作者: akb4888    时间: 2015-3-30 02:01

回复 2# pcl_test

感谢前辈指点,经测试您写的代码很好用。

不过果然带!开头的文件不好弄啊。碰到带!号开头要替换的文件夹的话就会卡在“正在替换文件夹名……”这里了。
不过没关系,反正通常工作中也不会碰到带!开头的文件夹。再次感谢!
作者: akb4888    时间: 2015-3-30 02:04

回复 3# CrLf


    嗯,之前有一位朋友也提了 sort /r 不过好像后来他删帖了?

总之我现在是改成这样来用了。
  1. for /f "delims=" %%i in ('dir /b/s^|sort /r') do (
  2. setlocal enabledelayedexpansion
  3. set "f=%%~nxi"
  4. call set f="%%f:%strtemp1%=%strtemp2%%%"
  5. if not "%%i"==%0 (     
  6. call ren "%%i" %%f%%
  7.      )
  8.      endlocal)
复制代码
虽然有些功能没法实现,也无法替换!开头的文件,这也暂时够用吧~谢谢您的帮助!
作者: pcl_test    时间: 2015-3-30 12:59

回复 5# akb4888
试试这样
  1. @echo off
  2. title 批量替换文件(文件夹)名
  3. echo 此批处理可批量替换本文件所在文件夹下所有文件(文件夹)名。
  4. echo.
  5. set /p str1= 请输入要替换的文件(文件夹)名字符串(可替换空格):
  6. set /p str2= 请输入替换后的文件(文件夹)名字符串(去除则直接回车):
  7. echo.
  8. echo 正在替换文件(文件夹)名……
  9. for /f "delims=" %%a in ('dir /s /b ^|sort /+65535') do (
  10. if "%%~nxa" neq "%~nx0" (
  11. set "file=%%a"
  12. set "name=%%~na"
  13. set "extension=%%~xa"
  14. call set "name=%%name:%str1%=%str2%%%"
  15. setlocal enabledelayedexpansion
  16. ren "!file!" "!name!!extension!" 2>nul
  17. endlocal
  18. )
  19. )
  20. echo 完成
  21. pause
复制代码

作者: akb4888    时间: 2015-3-31 00:37

回复 6# pcl_test


    非常感谢您的帮助!!完美解决了问题!
明天我先好好研究一下您的代码多学习一下,越来越觉得批处理有趣了~谢谢!
作者: 001011    时间: 2018-11-4 00:08

回复 6# pcl_test
为什么我替换有的时候成功  有的成功不行呢  奇怪
作者: 001011    时间: 2018-11-4 00:16

回复 6# pcl_test

比如说这个  我想把“.”替换成A  就总是不成功
作者: wjiash003    时间: 2020-6-27 19:39

文件夹名只能替换一个字符,不知道怎么调,如A.10.-3,用版主的代码后变成A_10.-3(指定点.替换为下划线_),文件名则能正常替换。
作者: ex1mlove    时间: 2023-8-4 22:41

回复 6# pcl_test


    大佬 有些文件没有文件名  是直接 .xxx 这形式的 好像会 变成 str1=str2.xxx
    怎么写 直接排除 “.” 开头的文件或者文件夹?
作者: 77七    时间: 2023-8-5 01:18

回复 9# 10# 11#
  1. @echo off
  2. rem 批处理保存为ansi编码格式。替换文件名(不包括扩展名)或者文件夹名中的指定字符
  3. set /p str1=替换前:
  4. set /p str2=替换后:
  5. for /f "delims=" %%i in ('dir /b /s ^|find /v "%~f0" ^|sort /r') do (
  6. set "f=%%~fi"
  7. set "n=%%~ni"
  8. set "x=%%~xi"
  9. setlocal enabledelayedexpansion
  10. if exist "!f!\" (
  11. set "nx=!n!!x!"
  12. ren "!f!" "!nx:%str1%=%str2%!"
  13. ) else if "!n!" neq "" (
  14. ren "!f!" "!n:%str1%=%str2%!!x!"
  15. )
  16. endlocal
  17. )
  18. pause
复制代码

作者: ex1mlove    时间: 2023-8-5 06:35

回复 12# 77七


    谢谢大神,完美!




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