iT邦幫忙

1

批次刪除超過7天檔案及空資料夾問題

  • 分享至 

  • xImage

請問我嘗試寫了一個.bat檔,想要刪除指定路徑下超過7天的檔案及刪除空資料夾
另外還想順便紀錄刪除的檔案及空資料夾
目前完成的指令如下,但是有幾個問題
1.想紀錄的刪除檔案都沒有正常寫入,只建了一個空資料檔
2.另外其實想將紀錄檔案的名稱自動依刪除的日期建立

因為不是專業,可以協助修改使其達到目的嗎
謝謝幫忙

set PP=P:\test
set ED=7
set LogPath=D:\log
ForFiles /p %PP% /s /d -%ED% /c "cmd /c del /q @file" >> %logpath%20250217.txt

dir %PP% /ad /b /s |sort /r >> %logpath%kill.txt

For /f %%i in (%logpath%kill.txt) DO rd %%i >> %logpath%killEmptyFolders.txt

2 個回答

0
iT邦見習生 ‧ 2025-02-17 13:09:26

問了GPT

@echo off
:: 設定變數
set PP=P:\test
set ED=7
set LogPath=D:\log

:: 取得今天的日期(格式 YYYYMMDD)
for /f "tokens=2 delims==" %%i in ('wmic os get localdatetime /value') do set datetime=%%i
set Today=%datetime:~0,8%

:: 動態設定日誌檔案名稱
set LogFile=%LogPath%\DeleteLog_%Today%.txt
set KillList=%LogPath%\KillList_%Today%.txt
set EmptyFoldersLog=%LogPath%\EmptyFolders_%Today%.txt

:: 確保 LogPath 存在
if not exist "%LogPath%" mkdir "%LogPath%"

:: 刪除 7 天前的檔案並紀錄
echo ===== 刪除超過 %ED% 天的檔案 [%Today%] ===== > "%LogFile%"
ForFiles /p "%PP%" /s /d -%ED% /c "cmd /c echo @path >> "%LogFile%" & del /q @file"

:: 列出所有資料夾,準備刪除空資料夾
dir "%PP%" /ad /b /s | sort /r > "%KillList%"

:: 刪除空資料夾並紀錄
echo ===== 刪除的空資料夾 [%Today%] ===== > "%EmptyFoldersLog%"
for /f "delims=" %%i in (%KillList%) do (
rd "%%i" 2>> "%EmptyFoldersLog%" && echo 已刪除: %%i >> "%EmptyFoldersLog%"
)

:: 顯示完成訊息
echo 清理完成,刪除紀錄已儲存於 %LogFile% 及 %EmptyFoldersLog%

locomike iT邦新手 5 級 ‧ 2025-02-17 17:14:59 檢舉

你好
我調整程下面的指令並存成.bat
這個檔案直接再命令提示字元執行正常
但是將這個批次檔設定在工作排程器裡,卻無法正常執行
不曉得是甚麼因素

::建立網路磁碟機
net use P: \gb_folder\public

cd D:\log

@echo off
:: 設定變數
set TARGET_DIR=P:\test
set ExpireDay=7
set LogPath=D:\log

:: 取得今天的日期(格式 YYYYMMDD)
for /f "tokens=2 delims==" %%i in ('wmic os get localdatetime /value') do set datetime=%%i
set Today=%datetime:~0,8%

:: 動態設定日誌檔案名稱
set LogFile=%LogPath%\DeleteLog_%Today%.txt
set KillList=%LogPath%\KillList_%Today%.txt
set EmptyFoldersLog=%LogPath%\EmptyFolders_%Today%.txt

:: 確保 LogPath 存在
if not exist "%LogPath%" mkdir "%LogPath%"

:: 刪除 7 天前的檔案並紀錄
echo ===== 刪除超過 %ExpireDay% 天的檔案 [%Today%] ===== > "%LogFile%"
ForFiles /p "%TARGET_DIR%" /s /d -%ExpireDay% /c "cmd /c echo @path >> "%LogFile%" & del /q @file"

:: 列出所有資料夾,準備刪除空資料夾
dir "%TARGET_DIR%" /ad /b /s | sort /r > "%KillList%"

:: 刪除空資料夾並紀錄
echo ===== 刪除的空資料夾 [%Today%] ===== >> "%LogFile%"
for /f "delims=" %%i in (%KillList%) do (rd "%%i" 2>> "%LogFile%" && echo 已刪除: %%i >> "%LogFile%")

:: 顯示完成訊息
echo 清理完成,刪除紀錄已儲存於 %LogFile%

::移除網路磁碟機
net use /delete P: /y

Willy iT邦新手 5 級 ‧ 2025-02-19 14:37:29 檢舉

你下面帶中文
一定要下chcp 65001

locomike iT邦新手 5 級 ‧ 2025-02-19 17:18:56 檢舉

@echo off 下面有加了
chcp 65001 >nul

主要是在本機命令提示字元下執行正常
但是把這個批次檔設在工作排程器上定期執行就沒有動作
一直不知道原因是甚麼

0
ming9900
iT邦新手 3 級 ‧ 2025-02-17 13:21:07

@echo off
chcp 65001 >nul
:: 設定要清理的資料夾路徑
set "TARGET_DIR=P:\test"

:: 設定 Log 檔案存放目錄
set "LOG_DIR=D:\log"

:: 取得目前日期與時間,格式為 YYYY-MM-DD_HH-MM-SS(使用 PowerShell 取代 wmic)
for /f %%i in ('powershell -command "Get-Date -Format 'yyyy-MM-dd_HH-mm-ss'"') do set datetime=%%i

:: 設定 Log 檔案名稱
set "LOG_FILE=%LOG_DIR%%datetime%_kill.log"

:: 建立 UTF-8 編碼的 LOG 檔案
echo -------------------- > "%LOG_FILE%"
echo %DATE% %TIME% 開始清理 >> "%LOG_FILE%"

:: 刪除超過 7 天的檔案,並記錄刪除的檔案名稱

forfiles /p "%TARGET_DIR%" /s /m . /d -7 /c "cmd /c echo 刪除: @path >> "%LOG_FILE%" & del /q @path"

:: 刪除空資料夾,並記錄刪除的資料夾名稱
for /f "delims=" %%D in ('dir "%TARGET_DIR%" /ad /s /b ^| sort /R') do (
rd "%%D" 2>nul && echo 刪除空資料夾: %%D >> "%LOG_FILE%"
)

echo %DATE% %TIME% 清理完成 >> "%LOG_FILE%"
echo -------------------- >> "%LOG_FILE%"

我要發表回答

立即登入回答