請問我嘗試寫了一個.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
問了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%
::建立網路磁碟機
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
你下面帶中文
一定要下chcp 65001
@echo off 下面有加了
chcp 65001 >nul
主要是在本機命令提示字元下執行正常
但是把這個批次檔設在工作排程器上定期執行就沒有動作
一直不知道原因是甚麼
@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%"