更新於 2024/07/09閱讀時間約 16 分鐘

批次刪除檔案與空目錄

1     作業流程

1.1 先取得欲刪除檔案集的相關資訊,並輸入5個參數值

1.2 依照取得的參數值,執行欲刪除的檔案   

1.3檔案刪除執行後,若目錄為空,則執行刪除該空目錄       

          

2     作業說明  

2.1  欲刪除檔案之的相關內容,使用者指定輸入,並設定如下5個參數

 PAR1--- 來源資料夾位址,  例D:\BACKUP

 PAR2 --- 幾天前檔案欲刪除,例 -30 or -2023/12/31 default=0

 PAR3--- 欲刪除檔案之名稱與副檔名 ,例TW*.txt or *高雄*  default=*.*

      PAR4--- 執行後出力檔案之存放路徑,例D:\BK   default=D:\DESTINATION

      PAR5--- 刪除作業之判斷,當輸入D 時,執行檔案刪除;

                    輸入非D 時,不會刪除檔案,只提供確認參考

輸入非D 時,如set PAR5=h , 則不會刪除,只會出力符合條件的file

結果txt出力如下:

**---The below parameters you want to process ---    週五 2024/07/05 15:04:47.59---

**1 Source path     :D:\TEST_BK

**2 Date or days    :-2024/10/1

**3 Sring of files  :*.pptx

**4 Destination path:D:\DESTINATION

ECHO is on.

 

 [ Inquired file list ] 

 

"D:\TEST_BK\新增 Microsoft PowerPoint 簡報.pptx"

**-------------------------------------- Finished at 週五 2024/07/05 15:04:47.66---

 

其他 參數 設定參考:

       set PAR1=D:\TEST_BK        

       set PAR2=-90      

       set PAR3=*.mp4*       

       set PAR4=D:\DESTINATION        

       set PAR5=D

          

2.2 刪除作業 

* 指定之來源資料夾(PAR1)目錄下包含子目錄下的檔案,若符合就刪除       

* 若刪除執行發生錯誤時,仍會繼續不會中斷,且將錯誤訊息出力至txt file供參考        

     

2.3 刪除空目錄作業, 即執行CALL  RD_EMPTY_fix-par.cmd   

2.3.1 來源目錄下每個目錄,每次執行都會查看是否存在檔案,若該目錄下0個檔案,則執行刪除該目錄

2.3.2 空目錄被刪除後,出力至txt檔案,記錄該目錄名稱

 

3     實例說明

3.1 來源目錄之指定

 本例設定為   set PAR1= D:\TEST_BK

3.2出力檔案名 : Inquiry_error_result.txt

<1>刪檔案錯誤場合

       若不能刪除檔案 會列出原因 (因權限關係,無法讀取)

<2>正常刪檔案場合

       刪除檔案正常時,txt列出訊息如下:

 **---The below parameters you want to process ---    週五 2024/07/05 15:15:20.94---

**1 Source path     :D:\TEST_BK

**2 Date or days    :-2024/7/31

**3 Sring of files  :*.*

**4 Destination path:D:\DESTINATION

ECHO is on.

 

 [ Cannot DEL file ] 

**-------------------------------------- Finished at 週五 2024/07/05 15:15:21.12---

<3>找無對象檔案場合,

   因為選取日期 +2025/1/1 ,故找無檔案,執行結果出力於 Inquiry_error_result.txt 內容如下:

 **---The below parameters you want to process ---    週五 2024/07/05 14:34:47.43---

**1 Source path     :D:\TEST_BK

**2 Date or days    :+2025/1/1

**3 Sring of files  :*.*

**4 Destination path:D:\DESTINATION

ECHO is on.

 

 [ Cannot DEL file ] 

  ERROR: No files found with the specified search criteria. 

**-------------------------------------- Finished at 週五 2024/07/05 14:34:47.56---

3.3 空目錄被刪除後,作業結果訊息出力至txt,empFOLDER_RD.txt內記錄兩個空目錄被刪除,參考如下:


[ Empty folder rased ] ----- on 週五 2024/07/05 14:34:47.57 

  "D:\TEST_BK\LDPlayer"   

  "D:\TEST_BK\YunGameDownload\leidian\Plugins"   

 

4     運用效果

4.1定期執行自動刪除作業bat,可節省硬體空間

4.2將bat設定自動排程,刪除檔案之作業,省下人力工時,提升工作效率

 

5     將來運用  

5.1 個人電腦內各個硬碟槽或伺服器公用槽內資料夾,均可比照運用  

5.2 各應用系統內各種平日交易檔案,歷史紀錄log檔等,均可比照運用,否則老舊過期檔案一直增加,將使硬碟容量龐大,影響系統效能或致系統異常當機。       

          

6     設計撰寫 :        

6.1刪除檔案之 Bat :DelF+RD.bat 

rem echo off
CHCP 65001
rem ----本檔案需保存為 UTF-8 ,CHCP 65001 為了顯示特殊字元(漢字日文) 。big5 ,CHCP 950
rem 入力檔目錄需先輸入,出力檔案名 Inquiry_error_result.txt
D:
cd D:\LINCT_material\PC\cmd-bat\cmd\Manipulate_file\Del99

rem ---[Noted] 不可用Iset PAR1=I:\99.暫存資料 ,因 schedule task 無法認得 ----
set PAR1=D:\TEST_BK

set PAR2=-2024/7/31
set PAR3=*.*
set PAR4=D:\DESTINATION
set PAR5=D

set PAR_ERR=N

IF NOT EXIST "%PAR1%" (echo ###ERROR : %PAR1% is not exist & set PAR_ERR=Y & goto END )
IF NOT EXIST %PAR4% ( md %PAR4% )
rem pause chk par1:%PAR1% par4:%PAR4% -----

echo **---The below parameters you want to process --- %DATE% %TIME%---> %PAR4%\Inquiry_error_result.txt
echo **1 Source path :%PAR1% >> %PAR4%\Inquiry_error_result.txt
echo **2 Date or days :%PAR2% >> %PAR4%\Inquiry_error_result.txt
echo **3 Sring of files :%PAR3% >> %PAR4%\Inquiry_error_result.txt
echo **4 Destination path:%PAR4% >> %PAR4%\Inquiry_error_result.txt
echo >> %PAR4%\Inquiry_error_result.txt

echo *** Files 執行中...for "%PAR1%" %PAR2% %PAR3% %PAR4% %PAR5%
IF %PAR5% == D ( CALL :DELFile ) else ( CALL :FIND )

:END
:: ---Noted "%PAR1%" 需有" " ,因資料夾名有(),致IF 指令語法錯誤 ---
IF %PAR_ERR% == Y (
echo *** Job ABEND 異常中止 for "%PAR1%" or %PAR4% is not exist---
echo *** Job ABEND 異常中止 for "%PAR1%" or %PAR4% is not exist---> %PAR4%\Inquiry_error_result.txt
) ELSE (
echo *** Files 執行完了 for "%PAR1%" %PAR2% %PAR3% %PAR4% %PAR5%
echo *---Please check result file save in %PAR4%\Inquiry_error_result.txt )
echo **-------------------------------------- Finished at %DATE% %TIME%--->> %PAR4%\Inquiry_error_result.txt
rem pause del end chk??

CALL RD_EMPTY_fix-par.cmd

rem pause job final end
EXIT

:DELFile
:: ---- del file 若成功del 無訊息印出, 只有錯誤有發生時,才會印出 ----
echo. >> %PAR4%\Inquiry_error_result.txt
echo [ Cannot DEL file ] >> %PAR4%\Inquiry_error_result.txt

For /f "tokens=* delims=?" %%A in ( 'forfiles /P "%PAR1%" /S /D %PAR2% /M "%PAR3%" /c "cmd /c del /F /Q /A @path" 2^>^&1 ' ) do ( echo %%A >> %PAR4%\Inquiry_error_result.txt )
exit /b

:FIND
echo. >> %PAR4%\Inquiry_error_result.txt
echo [ Inquired file list ] >> %PAR4%\Inquiry_error_result.txt
:: ---- echo inquiry all file list out, 包括存取被拒的file 也會印出 ----
forfiles /P "%PAR1%" /S /D %PAR2% /M "%PAR3%" /c "cmd /c echo @path ">>%PAR4%\Inquiry_error_result.txt 2^>^&1
exit /b


6.2刪除空目錄之cmd : RD_EMPTY_fix-par.cmd

rem ----本檔案需保存為 UTF-8 ,CHCP 65001 為了顯示特殊字元(漢字日文) -----
rem ---檢查目錄下含子目錄,若為空,則只刪除該下之空目錄 ,並出力 D:\DESTINATION\empFOLDER_RD.txt----
rem @echo on
@echo off
rem CHCP 65001
rem ---注意本for只找出目錄(含子目錄),沒找出file,
rem echo [ Empty folder rased ] ----- on %DATE:~0,4%/%DATE:~5,2%/%DATE:~8,2% >D:\DESTINATION\empFOLDER_RD.txt
echo [ Empty folder rased ] ----- on %DATE% %TIME% >D:\DESTINATION\empFOLDER_RD.txt

echo. >>D:\DESTINATION\empFOLDER_RD.txt
set /a n=0
set n_p1=N

:: ----PAR1 FIX 取得 -------
:Enter_par1

IF NOT EXIST "%PAR1%" ( echo ###ERROR : %PAR1% path is not exist & goto EOF )

for /f "delims=" %%i in ('dir "%PAR1%" /ad /b /s') do CALL :AAA "%%i"
if %n_p1%==N ( CALL :RD_Process "%PAR1%" )
echo --- To check RD result in D:\DESTINATION\empFOLDER_RD.txt-----
exit /b
rem goto EOF

rem ---找出的目錄內 存有的目錄與檔案共有幾個file,若0個,即是為空目錄,則 rase dir ---------
rem ---需有"delims=" 又 參數 %%i必須加" ", 這樣目錄名/檔名有空白,才可完整取出 ----
:AAA
set n_p1=Y
set /a n=0

for /f "delims=" %%j in ('dir %1 /a /b ' ) do ( set /a n=n+1 )
if %n%==0 ( CALL :RD_Process %1 )
exit /b

:RD_Process
RD %1
echo %1 >>D:\DESTINATION\empFOLDER_RD.txt
echo ====== To check dir=%1 , file cnt=%n% , PAR1_ALL_emp=%n_p1%
exit /b

:EOF
rem pause --- job is normal end


6.3   bat檔案需保存為 UTF-8 ,cmd 追加CHCP 65001 為了能正常顯示特殊字元漢字或日文 

------by linct-------

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.