Board logo

标题: [文件操作] 批处理怎样批量改文件名? [打印本页]

作者: regabc    时间: 2011-4-24 10:52     标题: 批处理怎样批量改文件名?

第一个问题:

请看:
“六23一s”儿1_21_424_3童节_021.html
偶然_,回_想起_六年前那难忘的一次_132.HTML

想变成:

“六23一s”儿1_21_424_3童节.txt
偶然_,回_想起_六年前那难忘的一次.txt

如何实现?有点难度了。


第二个问题:
  1. @echo off
  2. for /f "tokens=*" %%i in ('dir /b *.txt') do (
  3. ren %%~i wwf%%~ni.txt
  4. )
复制代码
上面这段改名称,居然对“New Text Document.txt”这样的名称不起作用,待我改成中文名称或者其它时,这段代码又起作用了,为什么?
作者: Commander    时间: 2011-4-24 11:02

  1. @echo off
  2. for /f "tokens=*" %%i in ('dir /b *.txt') do (
  3.     ren "%%~i" "wwf%%~ni.txt"
  4. )
复制代码

作者: Commander    时间: 2011-4-24 11:06

  1. @echo off
  2. for %%a in (*.html) do (
  3.     set "file=%%a"
  4.     setlocal enabledelayedexpansion
  5.     ren %%a !file:~0,-9!.txt
  6.     endlocal
  7. )
复制代码

作者: regabc    时间: 2011-4-24 11:11

That's Cool!
作者: regabc    时间: 2011-4-24 11:21

Commander,不好了,代码兼容性不高,当出现这样的文件名时,改不动了。你_22好朋_232友_21782874.html,Copy of _27398你要_219.HTML。结果下来是:你_22好朋_232友_2178.txt,Copy of _27398你要_219.HTML。如何解决?
作者: CrLf    时间: 2011-4-24 11:35

本帖最后由 zm900612 于 2011-4-24 11:44 编辑
  1. @echo off
  2. for %%a in (*.html) do (
  3.     set "file=%%a"
  4.     setlocal enabledelayedexpansion
  5.     for %%b in ("!file:_=\!") do (
  6.         endlocal
  7.         set file=%%~dpb
  8.         setlocal enabledelayedexpansion
  9.     )
  10.     ren "%%a" "!file:~0,-1!.txt"
  11.     endlocal
  12. )
复制代码

作者: hanyeguxing    时间: 2011-4-24 11:38

本帖最后由 hanyeguxing 于 2011-4-24 11:47 编辑
  1. @echo off&setlocal enableDelayedExpansion
  2. for %%a in (*.html) do (
  3. set "n=%%~na"
  4. for %%b in ("!n:_=\!") do (
  5. set "n=%%~pb"
  6. set "n=!n:\=_!"
  7. ren "%%a" "!n:~1,-1!.txt"
  8. ))
复制代码
或:
  1. @echo off&setlocal enableDelayedExpansion
  2. for %%a in (*.html) do (
  3. set "n=%%~na"
  4. set "n=!n:.=$!"
  5. for %%b in ("!n:_=.!") do (
  6. set "n=%%~nb"
  7. set "n=!n:.=_!"
  8. ren "%%a" "!n:$=.!.txt"
  9. ))
复制代码
注意:$为文件名中没有的字符
作者: CrLf    时间: 2011-4-24 12:29

7# hanyeguxing


哦,我忘了把变量改回来
作者: Hello123World    时间: 2011-4-24 13:26

本帖最后由 Hello123World 于 2011-4-24 13:32 编辑

1# regabc
第一个:
放在文件所在目录
  1. setlocal EnableDelayedExpansion
  2. for /r %%i in (*.html) do (set a=%%i
  3. ren "%%i" "!a:~0,-4!.txt")
复制代码
第二个:
  1. @echo off
  2. for /f "tokens=*" %%i in ('dir /b *.txt') do (
  3. ren "%%~i" "wwf%%~nxi"
  4. )
复制代码
不管什么时候都要为有空格的路径或者文件名加上双引号,因为空格是批处理的默认分隔符。
作者: Hello123World    时间: 2011-4-24 13:53

7# hanyeguxing
第一个代码是怎么实现了,理解不了
  1. @echo off
  2. @echo off&setlocal enableDelayedExpansion
  3. for %%a in (*.html) do (
  4.         set "n=%%~na"
  5. echo !n!
  6. pause
  7.         for %%b in ("!n:_=\!") do (
  8.                 set "n=%%~pb"
  9. echo !n!
  10. pause
  11.                 set "n=!n:\=_!"
  12. echo !n!
  13. pause
  14.                 ren "%%a" "!n:~1,-1!.txt"
  15. echo %%a
  16. echo !n:~1,-1!
  17. ))
  18. pause
复制代码
停顿的回显也是理解不了,
  1. 偶然_,回_想起_六年前那难忘的一次_132
  2. 请按任意键继续. . .
  3. \hello\偶然\,回\想起\六年前那难忘的一次\
  4. 请按任意键继续. . .
  5. _hello_偶然_,回_想起_六年前那难忘的一次_
  6. 请按任意键继续. . .
  7. 偶然_,回_想起_六年前那难忘的一次_132.HTML
  8. hello_偶然_,回_想起_六年前那难忘的一次
  9. 请按任意键继续. . .
复制代码
把_换成路径\,路径\最后又换回_,最后重名也达不到效果啊。回显也是这么表示的,但实际却实现效果了。
为什么?
作者: Hello123World    时间: 2011-4-24 13:54

本帖最后由 Hello123World 于 2011-4-24 14:16 编辑

我搞错了,以为目的是去掉_的批处理了。
……
第一个代码有个小漏洞,如果是在非根目录,会把目录名也加入到文件名中,就跟上面的回显一样。hello
第二个代码可行。

标记学习一下:
是对文件名的最后特殊符号进行处理的算法,利用%~pi(路径的特性:\) %~ni(文件扩展名的特性:.)




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