[批處理]自動按日期重命名文件名


簡述:

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

——原文發表於2012-1-29 01:32


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM