簡述:
最近在整理我爺爺拍的相片,大多是在02-06年間拍的相片
但是在整理起來發現難度很大,因為我爺爺的相機是聯想很早很早出品的一款相機
在文件名編制上有些缺陷,每次照相得到的相片編號都是按天編排
即每天一個文件夾,只是在每個文件夾中按001,002,003這樣排下去
但是問題在於在不同文件夾中,他們都是相同的文件名,全是001,001,001,001,如果就這樣分別放到不同文件夾下也可以
但是由於相片數量巨大一共有六千多張, 被分別放到了將近三百個文件夾中,查看起來異常繁瑣。。。
而且無法把這些照片統一放到一個文件夾下,因為他們有大量都是相同文件名的,無法放到同一文件夾下
所以需要將他們所有照片進行重新命名,並為他們生成一個絕對唯一的文件名
即使把這六千張照片全放到一個文件夾下,也不會重名而無法替換
並且還要保持他們原有的特性,如001,002,003這樣的順序,所有有了這個bat
原有目錄結構:異常繁雜,需要重新整理
使用方法:
把要處理的文件夾拖到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