图及原理(2015年03月23日)

一个 b!a!1235@_ s%#8i 三个 c.rar

h^e12 0~%l%!p!@.s321-file.txt

%o%%% !O!ffi9~ ce$- Wor8d29 Documentation.docx

重命名.bat

图一:

需要运行一个批处理,把这三个文件的文件名中的所有数字、汉字和特殊字符(包括空格)都去掉,重命名为只包含字母的文件,但是

后缀名不能改,批次名本身不能改。重命名后:

基础.rar

helps.txt

oOfficeWor.docx

重命名.bat

图2:

要求:代码简洁,通用,不能太低效。

假的:

复制代码代码如下:

@echo 关闭

for %%a in (*.*) do (

如果 “%%~nxa” neq “%~nx0” (

设置“名称=%%~na”

setlocal enabledelayedexpansion

设置 name1=!name!

呼叫:lp

ren “!name!%%~xa” “!nam!%%~xa”

设置 “nam=”

本地化

)

)

暂停

:lp

如果定义了 name1 (

设置 “var=!name1:~,1!”

如果 “!var!” leq “Z” (

如果 “!var!” geq “a” (

设置 “nam=!nam!!var!”

))

设置 “name1=!name1:~1!”

转到 lp

)

蝙蝠侠:

复制代码代码如下:

@echo 关闭

设置“代码=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 (

如果 “%%~nxa” neq “rename.bat” (

set “str=%%~na”&set “file=%%a”&set “var=%%~na”

setlocal enabledelayedexpansion

对于 (%code%) 中的 %%i,请设置 “str=!str:%%i=!”

设置 “str=!str: =!”&call :lp

ren “!file!” !files!%%~xa

本地化

))

转到:eof

:lp

设置 /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,一个字符一个字符会判断十几次,变量替换只能做一次。

替换后的字符串中是否只有非字母的字符?现在只需将其用作分隔符(不要忘记添加空格)以提取文件名中的所有字母,其余的只是技术性的。

迪硕:

按照pusofalse的思路,提取字符最方便的工具一定是正则表达式。唯一支持正则表达式的批处理命令是 findstr。可以用它来提取吗?

测试成功!

满足要求:简洁、通用、不会太低效。

特点:用途广泛,只需修改find​​str的正则参数即可实现各种功能,举几个例子。

“[^-!-~0-9a-z]” 保留全角字符(中文、全角标点符号等)

“[a-z0-9]” 保留英文字母和数字

复制代码代码如下:

@echo off&cls

for /f “tokens=*” %%i in (‘dir /b/a-d “*.*”‘) do (

如果 “%%~nxsi” neq “%~nxs0” (

set “old filename=%%~nxsi”&set “filename string=%%~ni”&set “new filename=”&set “counter=0”

del ~filenamechar.lst /q>nul 2>&1

setlocal enabledelayedexpansion

调用:拆分

for /f “tokens=*” %%n in (‘findstr “[a-z]” ~filenamechar.lst’) 设置 “new filename=!new filename!%%n”

如果“!新文件名!” neq “” (

echo ren!旧文件名! !新文件名!%%~xi

) 否则 (

echo ^(文件“!旧文件名!”不包含字母,不能重命名。^)

)

本地化

)

)

del ~filenamechar.lst /q>nul 2>&1

暂停&转到:eof

:分割

if “!文件名字符串:~%counter%,1!” neq “” (

if “!文件名字符串:~%counter%,1!” neq ” ” echo !文件名字符串:~%counter%,1!~filenamechar.lst

设置 /a counter+=1

转到拆分

)

转到:eof

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论