最近在整理我爺爺拍的相片,大可能是在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