最近在整理我爷爷拍的相片,大可能是在02-06年间拍的相片html
可是在整理起来发现难度很大,由于我爷爷的相机是联想很早很早出品的一款相机ide
在文件名编制上有些缺陷,每次照相获得的相片编号都是按天编排spa
即天天一个文件夹,只是在每一个文件夹中按001,002,003这样排下去
code
可是问题在于在不一样文件夹中,他们都是相同的文件名,全是001,001,001,001,若是就这样分别放到不一样文件夹下也能够htm
可是因为相片数量巨大一共有六千多张, 被分别放到了将近三百个文件夹中,查看起来异常繁琐。。。blog
并且没法把这些照片统一放到一个文件夹下,由于他们有大量都是相同文件名的,没法放到同一文件夹下token
因此须要将他们全部照片进行从新命名,并为他们生成一个绝对惟一的文件名字符串
即便把这六千张照片全放到一个文件夹下,也不会重名而没法替换get
而且还要保持他们原有的特性,如001,002,003这样的顺序,全部有了这个batcmd
原有目录结构:异常繁杂,须要从新整理
把要处理的文件夹拖到cmd下
开始执行文件夹重命名操做:
重命名预览:输入y之外的任何字符,都将退回初始状态(不区分大小写)
1,可设置文件过滤器,即源文件的过滤
set filter="*.*"
如只须要将JPG和AVI文件进行替换,则可写为:(中间有空格,末尾不要加空格)
set filter="*.jpg" "*.avi"
2,源文件名替换,src为要替换的字符串,dst为要替换为的字符串,dst为空则删除src字符串
set replacesrc=DSC0
set replacedst=
当前设置就是将源文件名中的DSC0删去,若是想要把源文件名中全部“0”替换成“-”则可写为:
set replacesrc=0
set replacedst=-
3,是否开启执行预览?(开启:N/关闭:Y)
set isisdo=N
即在执行真正改名操做前是否先查看预览,若是开启预览,则会在用户确认后再真正执行操做;反之不开启预览则直接进行改名操做
若是文件数量很是多,预览时间将比较长,建议关闭预览(默认开启预览)
1,判断用户输入的路径是否为空的方法:
可使用
set filepath=nul&set /p filepath=
if "%filepath:"=%"=="nul" cls&echo 不能为空!&goto start
先赋值一个默认值,再等待用户输入,若是直接回车则不执行赋值语句,其结果仍是为以前赋的初值
若要使用"双引号发判断,还须要先把变量中全部"双引号去掉,再统一加上,
这样无论原字符串是否有双引号,最终都会加上双引号,而且只有一对双引号
若是不过滤掉双引号,那么一旦用户输入一个双引号,程序就会直接退出,由于出现了错误
%filepath%的值为“"”这个双引号,那么if语句就成了
if """=="nul",这个语句会使前两个双引号进行配对,而最后一个双引号就成了错误字符,就直接致使程序退出
因此双引号要成对出现
2,使用call实现变量嵌套(具体讨论)
通过反复实验最终解决方法是:call set file=!datatime!-%%filesrc:!datatime!-=%%
实现了变量嵌套替换。
(先将原始文件名中的datatime删除,再在前面加上datatime,而不是一味的累加,实现只有一个datatime)
可是从理论上来说,filesrc在for中也发生变化,是不能使用%来标示变量的,可是使用call配合%%却没有任何错误
百思不得其解,只能先了解这么用好了
批处理代码,保存至bat文件运行便可:
@echo off title 自动按日期重命名文件名 by:小小沧海2012-1-29 setlocal EnableDelayedExpansion ::文件过滤器,请自行按须要更改,如需过滤JPG和AVI文件,则为"*.jpg" "*.avi" set filter="*.*" ::源文件名替换,src为要替换的字符串,dst为要替换为的字符串,dst为空则删除src字符串 set replacesrc=DSC0 set replacedst= ::是否开启执行预览?(开启:N/关闭:Y) set isisdo=N ::---------------------------------------------------------------- :start ::控制变量:“是否执行”,当为Y时真正执行改名操做,不然显示操做预览 set isdo=%isisdo% echo 请把要处理的文件夹拖入此处 set filepath=nul&set /p filepath= ::检查用户输入是否为空,同时还有过滤掉含有空格的"符号 if "%filepath:"=%"=="nul" cls&goto start ::检查用户输入是否为多个空格或只有双引号 set filepath=%filepath:"=% if "%filepath: =%"=="" cls&goto start cd /d %filepath% ::检查用户输入的文件夹是不是一个合法存在的文件夹 if %ERRORLEVEL%==1 cls&echo ×输入的文件夹错误!&goto start :do echo 正在准备开始处理,请稍后... ::取得目标目录下全部符合条件的文件的彻底路径名 for /f "delims=" %%n in ('dir /s /b /a:-d %filter%') do ( ::循环遍历取得当前文件的信息,按行分割并过滤掉以空格开头的行 for /f "eol= delims=" %%s in ('dir /-c "%%n"') do ( ::再把过滤后的一行字符串按空格进行分割,取得日期,时间和原文件名 for /f "tokens=1-2 delims= " %%i in ("%%s") do ( ::构造前缀字符串 set data=%%i set time=%%j set datatime=!data:-=!_!time::=! ::构造原文件名字符串,同时替换相应字符 set filesrc=%%~nxn set filesrc=!filesrc:%replacesrc%=%replacedst%! ::构造最终文件名,并使用call将原有的前缀字符串替换掉 call set file=!datatime!-%%filesrc:!datatime!-=%% ::构造结果为:日期_时间-原替换后文件名 if /i !isdo!==y ( echo 执行改名:"%%~nxn"→"!file!" ::真正执行重命名的语句 ren "%%n" "!file!" ) else ( echo 预览改名:"%%~nxn"→"!file!" ) ) ) ) ::若是“是否执行”不为Y则询问是否真正执行操做 if /i %isdo% NEQ y ( echo ----------------------------- echo.&echo 以上为执行预览,是否执行[是:Y/否:N] set isdo=n&set /p isdo= if /i !isdo!==y (goto do) else (cls&goto start) ) echo ----------------------------- echo.&echo 处理完成! pause>nul cls&goto start
——原文发表于2012-1-29 01:32