请问我尝试写了一个.bat档,想要删除指定路径下超过7天的档案及删除空资料夹另外还想顺便纪录删除的档案及空资料夹目前完成的指令如下,但是有几个问题1.想纪录的删除档案都没有正常写入,只建了一个空资料档2.另外其实想将纪录档案的名称自动依删除的日期建立

因为不是专业,可以协助修改使其达到目的吗谢谢帮忙

set PP=P:\\testset ED=7set 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%


  • 3

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%"