来个新思路(思路是namejm的);- @echo off
- set "code=a b c d e f g h i j k l m n o p q r s t u v w x y z"
- for /f "delims=" %%a in ('dir /s /a-d /b') do (
- if "%%~nxa" neq "重命名.bat" (
- set "str=%%~na"&set "file=%%a"&set "var=%%~na"
- setlocal enabledelayedexpansion
- for %%i in (%code%) do set "str=!str:%%i=!"
- set "str=!str: =!"&call :lp
- ren "!file!" !files!%%~xa
- endlocal
- ))
- goto :eof
- :lp
- set /a n+=1
- for /f "tokens=%n% delims=%str% " %%a in ("%var%") do (
- if "%%a" neq "" set "files=!files!%%a"&goto lp
- )
复制代码
描述下整体思路吧:
----------------------------------------------------------------------------------------------------------------------------------------------------
大家看到了题中的文件名是由字母+数字+特殊字符+汉字组成的,看起来很复杂,但我们是不是可以换个角度这样看:文件名是由分隔符+字母组成的(将数字、特殊字符、汉字全看成分隔符),是不是简单多了,呵呵,麻烦的还在后面。。。
----------------------------------------------------------------------------------------------------------------------------------------------------
那么,我们又遇到问题了:数字、特殊字符还好说数量是有限的,汉字可是个麻烦事啊,我们总不能在delims=后面把所有汉字全写上吧(况且这个长度是有限的)?这是不可能的,怎么办呢?于是,我们可以先将文件名中不是字母的字符全提出来,怎么提?这就要用到变量替换了,将26个字母全替换为空。
----------------------------------------------------------------------------------------------------------------------------------------------------
有人会说了效率有问题,这里确实存在效率问题,但大家想一下比较逐字符的判断的效率这个还是要高一点,为什么?假设一个文件名有十几个a,用逐字符就要判断十几次,而变量替换只一次就搞定了。
----------------------------------------------------------------------------------------------------------------------------------------------------
经过这样替换后的字符串中是不是只留下了不是字母的字符。现在只要把其来做为分隔符(别忘了加上空格)来提取文件名中的所有的字母了,而剩下的工作就只是技术处理了。
----------------------------------------------------------------------------------------------------------------------------------------------------
[ 本帖最后由 batman 于 2008-7-28 01:23 编辑 ] |