标题: [文件操作] 求助批处理删除文件名称中的汉字只保留数字? [打印本页]
作者: 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
- @echo off
- set "str=我是谁01"
- :kaishi
- echo %str:~0,1%|findstr "^[0-9]*$">nul || (set str=%str:~1%&goto kaishi)
- echo %str%
- pause
复制代码
可以根据这个思路改成需要的(没有做不到,只有想不到)
[ 本帖最后由 zjw767676 于 2009-3-11 22:48 编辑 ]
作者: namejm 时间: 2009-3-11 23:07
批处理擅长的就是对文件名进行操作,楼主最好描述一下文件名的规律,比如:所有的rm文件中,文件名是不是只有汉字和数字?若有其他字符,有没有什么分隔标志?否则,代码不好写。
作者: zjw767676 时间: 2009-3-11 23:41
- @echo off
- ::文件都是如LZ所说一样的格式列在test.txt中
- for /f %%i in (test.txt) do call :aa %%~ni
- pause::[提示按任意键结束...]
- :aa
- set str=
- set "str=%1"
- :kaishi
- echo %str:~0,1%|findstr "^[0-9]*$">nul || (set str=%str:~1%&goto kaishi)
- echo %str%.rm>>test2.txt
- goto :eof
复制代码
作者: Batcher 时间: 2009-3-12 00:11
- @echo off
- ::RM格式电影重命名演示程序
- ::只保留文件名中的数字(不考虑数字重复的情况)和后缀名
- ::如何演示结果无误,把ren前面的echo去掉,即可实现真正重命名。
- setlocal enabledelayedexpansion
- set FilmFolder=C:\test
- for /f "delims=" %%a in ('dir /s /b %FilmFolder%\*.rm') do (
- call :NumFilter %%~na
- if "!num!" neq "" (
- echo ren "%%a" !num!%%~xa
- )
- )
- pause
- goto :eof
-
- :NumFilter
- set "str=%1"
- set num=
- :LoopFilter
- set char=%str:~0,1%
- if %char% geq 0 (
- if %char% leq 9 (
- set num=!num!%char%
- )
- )
- set str=%str:~1%
- if "%str%" neq "" (
- goto :LoopFilter
- ) else (
- goto :eof
- )
复制代码
作者: 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去掉,即可实现真正重命名。
::文件名不能含有 ! & 符号。- @echo off&Setlocal EnableDelayedExpansion
- for /l %%a in (0 1 9) do set .%%a=a
- for /f "delims=" %%a in ('dir/b/s/a-d *.rm') do (
- set str=&set num=%%~na
- set "num=!num: =!"
- for /l %%i in (0 1 9) do set "num=!num:%%i= %%i !"
- for %%i in (!num!) do if defined .%%i set "str=!str!%%i"
- if defined str echo ren "%%a" "!str!%%~xa"
- )
- 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
也发一个- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b/s/a-d c:\rm\*.rm') do (
- set str=%%~nxi
- call :lp "%%~ni"
- if not exist "%%~dpi!str!" ren "%%i" "!str!"
- )
- pause&exit
- :lp
- for /f "tokens=1* delims=0123456789" %%i in (%1) do (
- if "%%i"=="" goto :eof
- set str=!str:%%i=!
- call:lp "%%j"
- )
复制代码
作者: zqz0012005 时间: 2009-3-21 00:06
我也来一个- @echo off
- for /f "delims=" %%a in ('dir /a-d/s/b *.rm^|findstr /ie "\.rm"') do (
- set str=%%a
- setlocal EnableDelayedExpansion
- call :check
- for %%i in (!NaN!) do echo ren "!str!" "!str:~-%%i!"
- endlocal
- )
- pause&exit/b
- :check
- for /l %%i in (4 1 260) do (
- if "!str:~-%%i,1!" lss "0" (goto :eof) else if "!str:~-%%i,1!" gtr "9" goto :eof
- set NaN=%%i
- )
复制代码
上面为什么到260,是因为UNC通用命名规则规定:路径(文件的完整路径)的最大长度为260个字符。(显然文件名无法件取到260个字符,但上面的代码写260也不会影响效率)
[ 本帖最后由 zqz0012005 于 2009-3-21 00:27 编辑 ]
作者: zqz0012005 时间: 2009-3-21 00:28
将你们的改进一下:- @echo off
- for /f "delims=" %%a in ('dir /a-d/s/b *.rm^|findstr /ie "[0-9]\.rm"') do (
- set strFullName=%%a&set strName=%%~nxa
- setlocal enabledelayedexpansion
- call :lp
- echo ren "!strFullName!" "!strName!"
- endlocal
- )
- pause&exit/b
- :lp
- for /f "tokens=1* delims=0123456789" %%a in ("!strName!") do (
- if not "%%b"=="" set strName=!strName:*%%a=!&goto lp
- )
复制代码
作者: luo0527 时间: 2009-3-27 16:45
哈哈!!!!!!!!!!!!!!!!!!!!!!!!!多谢.....我写了个小程序解决了...
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |