批处理实现批量修改文件名
我们已经会使用循环命令对大量文件改名进行批量处理。但总结一下,该批处理并不是很健壮。
判断一个程序的好坏,往往不是站在程序员的角度,而从用户的角度出发。
比如:在用户使用它的时候,如果输入了不正确的路径格式怎么办?如果输入了含有非法符号的前缀怎么办?输入的扩展名也有问题怎么办?改完名后看不到是否执行成功的反馈信息,等等。带着这些想法,我们将原程序再次修改一下。
:::::::批量修改文件名.bat:::::::
@echooff
title批量修改文件名
setlocalEnableDelayedExpansion
::启用延迟变量扩充
:GetPath
setzpath=%CD%
::对变量进行初始化,防止用户不输入而直接跳过。其中%CD%表示当前路径
set/pzpath=请输入目标文件所在的路径:
if%zpath:~0,1%%zpath:~-1%==""setzpath=%zpath:~1,-1%
::检查变量zpath的第一个和最后一个字符是否为"",是的话就去掉
ifnotexist"%zpath%"goto:GetPath
::如果zpath值的路径不存在,就得跳转回去,要求重新输入
:GetPrefix
setprefix=未命名
set/pprefix=请输入文件名前缀(不能包含以下字符\/:*?"<>|):
for/f"delims=\/:*?<>|tokens=2"%%iin("z%prefix%z")dogoto:GetPrefix
::这里对变量perfix进行检查,发现有非法符号便跳转到:GetPrefix
::事实上,这里并没有对双引号"进行检测,因为双引号无法在此被转义为可用的分隔符
::即使是在这个程序里,不正确地使用双引号也会引起程序异常而退出。
::因此,想把它做的非常人性化并不是一件容易的事情
:GetExt
setext=.*
set/pext=请输入文件的扩展名(不输入则表示所有类型):
ifnot"%ext:~0,1%"=="."setext=.%ext%
::检查变量ext的第一个是否为句点.,不是的话就加上
::建议这里对变量ext也检查一下,发现有除*外的非法符号便跳转到:GetExt
setanswer=N
echo.
echo您试图将%zpath%\里的所有%ext%类型的文件以%prefix%为前缀名进行批量改名,是否继续?
set/panswer=继续请输入Y,输入其它键放弃...
if"%answer%"=="Y"goto:ReadyToRename
if"%answer%"=="y"goto:ReadyToRename
echo放弃文件改名,按任意键退出...&goto:PauseThenQuit
:ReadyToRename
set/anum=0
echo.
if"%ext%"==".*"(
for%%iin("%zpath%\*%ext%")do(
set/anum+=1
ren"%%i""%prefix%!num!%%~xi"||echo文件%%i改名失败&&set/anum-=1
)
)else(
for%%iin("%zpath%\*%ext%")do(
set/anum+=1
ren"%%i""%prefix%!num!%ext%"||echo文件%%i改名失败&&set/anum-=1
)
)
if%num%==0echo%zpath%\里未发现任何文件。按任意键退出...&goto:PauseThenQuit
echo文件改名完成,按任意键退出...
:PauseThenQuit
pause>nul
::::::::::::::::::::::::::::::::