标题: [文件操作] [已解决]批处理如何替换文件夹名和文件名里的指定字符或字符串 [打印本页]
作者: akb4888 时间: 2015-3-29 22:10 标题: [已解决]批处理如何替换文件夹名和文件名里的指定字符或字符串
本帖最后由 pcl_test 于 2016-8-14 11:56 编辑
本人没有什么基础,就是突然喜欢上鼓捣批处理。自己胡搞瞎弄了一番。- @echo off&color 3a&set c=0123456789abcdefghijklmnopqrstuvwxyz
-
- title 批量替换文件(文件夹)名
-
- echo.
-
- echo 此批处理可批量替换本文件所在文件夹下所有文件的文件名。
-
- echo.
- echo.&set /p strtemp1= 请输入要替换的文件(文件夹)名字符串(可替换空格):
-
- echo.&set /p strtemp2= 请输入替换后的文件(文件夹)名字符串(删除则直接回车):
-
- for /f "delims=" %%i in ('dir /s /b') do (
- setlocal enabledelayedexpansion
- set "f=%%~nxi"
- set "f1=!f:%strtemp1%=%strtemp2%!"
- if not "%%i"==%0 (
- if not "!f!"=="!f1!" (
- if exist "!f1!" (
- echo 由于!f1!存在同名,!f! 文件名未改 ) else ren "!f!" "!f1!"
- )
- endlocal
- )
- )
复制代码
上面这段代码是我这几天在网上东拼西凑来的,
现在问题是:
1、不能把文件夹和文件的字符同时替换,网上查了下,好像是因为先把父文件夹的字符替换了,所以后面文件的路径就找不到了因此失效。如果要实现文件夹和文件同时替换,代码要怎么修改?
2、好像不能对!号等特殊字符开头的文件和文件夹进行替换,要怎么办?
如果2比较难实现,代码比较麻烦我这种水平也理解不了,可以告诉我问题1的解决方法吗?问题1目前比较重要……
谢谢大家!!新来的如果发帖有什么不对的地方还请包含。
作者: pcl_test 时间: 2015-3-30 00:37
本帖最后由 pcl_test 于 2015-3-30 10:21 编辑
回复 1# akb4888 - @echo off & color 3a & setlocal enabledelayedexpansion
- title 批量替换文件(文件夹)名
- echo 此批处理可批量替换本文件所在文件夹下所有文件(文件夹)名。
- echo.
- set /p str1= 请输入要替换的文件(文件夹)名字符串(可替换空格):
- set /p str2= 请输入替换后的文件(文件夹)名字符串(去除则直接回车):
- echo.
- echo 正在替换文件名……
- for /f "delims=" %%a in ('dir /a-d /s /b') do (
- if "%%~nxa" neq "%~nx0" (
- set "f=%%~na"
- set "f=!f:%str1%=%str2%!"
- if not exist "%%~dpa!f!%%~xa" ren "%%a" "!f!%%~xa"
- )
- )
- echo 替换文件名完成
- echo.
- echo 正在替换文件夹名……
- :folder
- set n=0
- for /f "delims=" %%i in ('dir /ad /s /b ^|find "%str1%"') do (
- set t=%%~ni
- set t=!t:%str1%=%str2%!
- if not exist "%%~dpi!t!" ren "%%i" "!t!" 2>nul
- set /a n+=1
- )
- if "!n!" neq "0" goto folder
- echo 替换文件夹名完成
- pause
复制代码
作者: CrLf 时间: 2015-3-30 00:54
本帖最后由 CrLf 于 2015-3-30 00:55 编辑
先文件和子文件再文件夹复制代码
或复制代码
作者: akb4888 时间: 2015-3-30 02:01
回复 2# pcl_test
感谢前辈指点,经测试您写的代码很好用。
不过果然带!开头的文件不好弄啊。碰到带!号开头要替换的文件夹的话就会卡在“正在替换文件夹名……”这里了。
不过没关系,反正通常工作中也不会碰到带!开头的文件夹。再次感谢!
作者: akb4888 时间: 2015-3-30 02:04
回复 3# CrLf
嗯,之前有一位朋友也提了 sort /r 不过好像后来他删帖了?
总之我现在是改成这样来用了。- for /f "delims=" %%i in ('dir /b/s^|sort /r') do (
- setlocal enabledelayedexpansion
- set "f=%%~nxi"
- call set f="%%f:%strtemp1%=%strtemp2%%%"
- if not "%%i"==%0 (
- call ren "%%i" %%f%%
- )
- endlocal)
复制代码
虽然有些功能没法实现,也无法替换!开头的文件,这也暂时够用吧~谢谢您的帮助!
作者: pcl_test 时间: 2015-3-30 12:59
回复 5# akb4888
试试这样- @echo off
- title 批量替换文件(文件夹)名
- echo 此批处理可批量替换本文件所在文件夹下所有文件(文件夹)名。
- echo.
- set /p str1= 请输入要替换的文件(文件夹)名字符串(可替换空格):
- set /p str2= 请输入替换后的文件(文件夹)名字符串(去除则直接回车):
- echo.
- echo 正在替换文件(文件夹)名……
- for /f "delims=" %%a in ('dir /s /b ^|sort /+65535') do (
- if "%%~nxa" neq "%~nx0" (
- set "file=%%a"
- set "name=%%~na"
- set "extension=%%~xa"
- call set "name=%%name:%str1%=%str2%%%"
- setlocal enabledelayedexpansion
- ren "!file!" "!name!!extension!" 2>nul
- endlocal
- )
- )
- echo 完成
- 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#- @echo off
- rem 批处理保存为ansi编码格式。替换文件名(不包括扩展名)或者文件夹名中的指定字符
- set /p str1=替换前:
- set /p str2=替换后:
- for /f "delims=" %%i in ('dir /b /s ^|find /v "%~f0" ^|sort /r') do (
- set "f=%%~fi"
- set "n=%%~ni"
- set "x=%%~xi"
- setlocal enabledelayedexpansion
- if exist "!f!\" (
- set "nx=!n!!x!"
- ren "!f!" "!nx:%str1%=%str2%!"
- ) else if "!n!" neq "" (
- ren "!f!" "!n:%str1%=%str2%!!x!"
- )
- endlocal
- )
- pause
复制代码
作者: ex1mlove 时间: 2023-8-5 06:35
回复 12# 77七
谢谢大神,完美!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |