Windows备份会自动给所有文件加上时间戳的信息。对于机器来讲它可以区分不同时刻的备份。而对于人来说看上去十分蛋疼。现在要做的就是用Windows的批处理给它们重命名,摆脱冗长的累赘!
去年12月的时候想要做一个这样的东西,拖到现在才完成了一个简单的版本。原因在于Windows批处理实在太难用。作为M$的亲生儿子,却不教它怎样方便用户使用。命令功能低下,帮助文档也很晦涩。然而功夫不负有心人,终于利用批处理各种特性写出了一个能够拿来简单用一用的东西。
直接上代码:
@echo off
setlocal enabledelayedexpansion
for %%a in ("*") do (
set str=%%a
set ini=%%a
set i=0
set ind=0
set new=
call :lp
)
pause
exit /b
::process string
:lp
if not "!str!"=="" (
set "ch=!str:~0,1!"
set "str=!str:~1!" ::cut
if "!ch!"==" " (
set ind=1
) else (
if !ind!==1 (
if "!ch!"=="(" (
set ind=10
goto fin
) else set ind=0 )
)
set new=!new!!ch!
set /a i=i+1
goto lp
)
exit /b
:fin
if !ind!==10 (
set new=!new:~0,-1!
set str=!str:~24!
set new=!new!!str!
echo RENAME: !new!
ren "!ini!" "!new!"
)
exit /b
使用方法:新建文本文档,复制粘贴以上内容。保存并关闭,将该文档重命名为.bat格式并存放在要修改文件名的目录下,双击即可运行。
功能:修改所有当前文档下被Windows污染的文件名
警告:该程序替换的原理是识别一个空格和一个左括号,将到右括号中间的内容全部删除。另外,同一文件夹下不能有原文件名相同的文件。
运行效果:
================================分割线====================================
M$这么多年了,也不学学人家Unix。人一个Perl脚本命令的rename自带正则匹配的功能。Windows批处理的替换只能替换特定文本,要使用正则表达式必须用findstr。这个findstr还无法提取指定文本,只能打印出所在行,与Unix的grep命令类似。于是,只好使用最原始的办法,逐字符的截短字符串并匹配,十分痛苦。
本次的小程序让我学会了不少批处理的原理与技巧,包括延时变量、字符串截取、goto与call,等等。深刻地验体验到了DOS时代程序员的生活。有着像Unix一样开源的系统是多么幸福呀。