Board logo

标题: [文件操作] 求助批处理删除文件名称中的汉字只保留数字? [打印本页]

作者: luo0527    时间: 2009-3-11 21:34     标题: 求助批处理删除文件名称中的汉字只保留数字?

意思是这样的。

比如有这么个名子 "批处理之家01"   

然后直接把它改成01 。只判断可有数字。有数字就保留数字。其它全部删除。

因为我这里的电影服务器高达10W部电影。都是这样的命名。现在要改了。手动的话就要累死了。
作者: Batcher    时间: 2009-3-11 22:04

没有数字的咋办?
数字有重复的咋办?
作者: luo0527    时间: 2009-3-11 22:14

没有数字直接跳过不处理。

另外讲一下限格式。RM 格式。要不然把其它程序也给改名子就不好了。
作者: luo0527    时间: 2009-3-11 22:15

难道还真能做出来???
批处理有这么强大吗?哇哈哈。
作者: zjw767676    时间: 2009-3-11 22:33

  1. @echo off
  2. set "str=我是谁01"
  3. :kaishi
  4. echo %str:~0,1%|findstr "^[0-9]*$">nul || (set str=%str:~1%&goto kaishi)
  5. echo %str%
  6. pause
复制代码
可以根据这个思路改成需要的(没有做不到,只有想不到)

[ 本帖最后由 zjw767676 于 2009-3-11 22:48 编辑 ]
作者: namejm    时间: 2009-3-11 23:07

  批处理擅长的就是对文件名进行操作,楼主最好描述一下文件名的规律,比如:所有的rm文件中,文件名是不是只有汉字和数字?若有其他字符,有没有什么分隔标志?否则,代码不好写。
作者: zjw767676    时间: 2009-3-11 23:41

  1. @echo off
  2. ::文件都是如LZ所说一样的格式列在test.txt中
  3. for /f %%i in (test.txt) do call :aa %%~ni                 
  4. pause::[提示按任意键结束...]
  5. :aa
  6. set str=
  7. set "str=%1"
  8. :kaishi
  9. echo %str:~0,1%|findstr "^[0-9]*$">nul || (set str=%str:~1%&goto kaishi)
  10. echo %str%.rm>>test2.txt
  11. goto :eof
复制代码

作者: Batcher    时间: 2009-3-12 00:11

  1. @echo off
  2. ::RM格式电影重命名演示程序
  3. ::只保留文件名中的数字(不考虑数字重复的情况)和后缀名
  4. ::如何演示结果无误,把ren前面的echo去掉,即可实现真正重命名。
  5. setlocal enabledelayedexpansion
  6. set FilmFolder=C:\test
  7. for /f "delims=" %%a in ('dir /s /b %FilmFolder%\*.rm') do (
  8.   call :NumFilter %%~na
  9.   if "!num!" neq "" (
  10.     echo ren "%%a" !num!%%~xa
  11.   )
  12. )
  13. pause
  14. goto :eof
  15. :NumFilter
  16. set "str=%1"
  17. set num=
  18. :LoopFilter
  19. set char=%str:~0,1%
  20. if %char% geq 0 (
  21.   if %char% leq 9 (
  22.     set num=!num!%char%
  23.   )
  24. )
  25. set str=%str:~1%
  26. if "%str%" neq "" (
  27.   goto :LoopFilter
  28. ) else (
  29.   goto :eof
  30. )
复制代码

作者: luo0527    时间: 2009-3-12 21:14

多谢各位!我明天上班就来测试。

本来想自己写了一个程序来的。苦于刚刚玩。NET程序不足一个月。着实写不出。

另外也不会有重复的。因为都是电影。格式如下

士兵突击(此为文件夹)\士兵突击01.rm
士兵突击(此为文件夹)\士兵突击02.rm
士兵突击(此为文件夹)\士兵突击03.rm

[ 本帖最后由 luo0527 于 2009-3-12 21:15 编辑 ]
作者: namejm    时间: 2009-3-12 21:28

  如果要写一个通用代码,估计够呛。最好的办法是针对具体应用,尽可能地利用现有条件编写代码,则难度大为降低。而代码最终编成什么模样,是和数据格式密切相关的,所以,楼主应该提供尽可能多的数据信息,比如:文件名的组成规律是什么?是不是只有汉字和数字(看你的标题描述应该如此,但是最好能确认一下)?汉字和数字是混杂的还是各自连成一串?仅凭顶楼的一个举例,远远无法窥知全貌,楼主应该用文字详细加以说明。
作者: luo0527    时间: 2009-3-14 16:37

格式具体是带有特有特殊符号的.如☆ 汉字.最后是字母.

☆☆这是一个电影名称01.rm 就是这么样的格式.全部名称都是这样的.
作者: 随风    时间: 2009-3-14 17:23

::只保留文件名中的数字(不考虑改名后重名的情况)
::如果演示结果无误,把ren前面的echo去掉,即可实现真正重命名。
::文件名不能含有 ! & 符号。
  1. @echo off&Setlocal EnableDelayedExpansion
  2. for /l %%a in (0 1 9) do set .%%a=a
  3. for /f "delims=" %%a in ('dir/b/s/a-d *.rm') do (
  4.    set str=&set num=%%~na
  5.    set "num=!num: =!"
  6.    for /l %%i in (0 1 9) do set "num=!num:%%i= %%i !"
  7.    for %%i in (!num!) do if defined .%%i set "str=!str!%%i"
  8.    if defined str echo ren "%%a" "!str!%%~xa"
  9. )
  10. pause
复制代码

[ 本帖最后由 随风 于 2009-3-14 17:32 编辑 ]
作者: luo0527    时间: 2009-3-20 17:53

经过测试。全部不通过。
另外问一下随风。在哪去掉echo?
作者: 随风    时间: 2009-3-20 18:28

代码中只有2个echo 你说去掉哪个呢?
作者: Batcher    时间: 2009-3-20 20:30     标题: 回复 13楼 的帖子

好好看看批处理基础教程吧,总想要现成的代码不利于自己的提高。
作者: terse    时间: 2009-3-20 20:42

也发一个
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b/s/a-d c:\rm\*.rm') do (
  3.        set str=%%~nxi
  4.        call :lp "%%~ni"
  5.        if not exist "%%~dpi!str!" ren "%%i" "!str!"
  6.        )
  7. pause&exit
  8. :lp
  9. for /f "tokens=1* delims=0123456789" %%i in (%1) do (
  10.     if "%%i"=="" goto :eof
  11.     set str=!str:%%i=!
  12.     call:lp "%%j"
  13. )
复制代码

作者: zqz0012005    时间: 2009-3-21 00:06

我也来一个
  1. @echo off
  2. for /f "delims=" %%a in ('dir /a-d/s/b *.rm^|findstr /ie "\.rm"') do (
  3.     set str=%%a
  4.     setlocal EnableDelayedExpansion
  5.     call :check
  6.     for %%i in (!NaN!) do echo ren "!str!" "!str:~-%%i!"
  7.     endlocal
  8. )
  9. pause&exit/b
  10. :check
  11. for /l %%i in (4 1 260) do (
  12.     if "!str:~-%%i,1!" lss "0" (goto :eof) else if "!str:~-%%i,1!" gtr "9" goto :eof
  13.     set NaN=%%i
  14. )
复制代码
上面为什么到260,是因为UNC通用命名规则规定:路径(文件的完整路径)的最大长度为260个字符。(显然文件名无法件取到260个字符,但上面的代码写260也不会影响效率)

[ 本帖最后由 zqz0012005 于 2009-3-21 00:27 编辑 ]
作者: zqz0012005    时间: 2009-3-21 00:28

将你们的改进一下:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /a-d/s/b *.rm^|findstr /ie "[0-9]\.rm"') do (
  3.     set strFullName=%%a&set strName=%%~nxa
  4.     setlocal enabledelayedexpansion
  5.     call :lp
  6.     echo ren "!strFullName!" "!strName!"
  7.     endlocal
  8. )
  9. pause&exit/b
  10. :lp
  11. for /f "tokens=1* delims=0123456789" %%a in ("!strName!") do (
  12.     if not "%%b"=="" set strName=!strName:*%%a=!&goto lp
  13. )
复制代码

作者: luo0527    时间: 2009-3-27 16:45

哈哈!!!!!!!!!!!!!!!!!!!!!!!!!多谢.....我写了个小程序解决了...




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