协慌网

登录 贡献 社区

批处理文件以删除超过 N 天的文件

我正在寻找一种删除批处理文件中所有 7 天以上的文件的方法。我在网上搜索,发现了一些包含数百行代码的示例,而另一些示例则需要安装额外的命令行实用程序才能完成任务。

只需几行代码 即可在 BASH中完成类似的操作。似乎可以对 Windows 中的批处理文件执行至少在远程上容易的事情。我正在寻找一种可以在标准 Windows 命令提示符下运行且没有任何其他实用程序的解决方案。请不要使用 PowerShell 或 Cygwin。

答案

享受:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"

有关更多详细信息,请参见forfiles文档。

有关更多信息,请参阅Windows XP 命令行的 AZ 索引

如果您forfiles ,请将其从任何Windows Server 2003复制到 Windows XP 计算机上,位于%WinDir%\system32\ 。因为 EXE 在 Windows Server 2003 和 Windows XP 之间完全兼容,所以这是可能的。

Windows 和 Windows Server 的更高版本默认情况下已安装它。

对于 Windows 7 和更高版本(包括 Windows 10):

语法略有变化。因此,更新后的命令为:

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"

运行以下命令

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q

通过 robocopy 将所有文件(使用 / mov 移动文件,然后删除它们,而不是 / move 移动整个文件树,然后删除它们)通过 robocopy 移到另一个位置,然后在该路径上执行 delete 命令,好的。

另外,如果您的目录中包含大量数据,则可以使用/mir开关

Ok 有点无聊,并提出了这个建议,其中包含我的一个穷人的 Linux 时代替换版本,该版本仅限于日常使用(无时间限制):

7 天清理

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

用法

set /a strip=day*7 :将7更改为要保留的天数。

set dSource=C:\temp :这是检查文件的起始目录。

笔记

这是非破坏性的代码,它将显示会发生的情况。

改变 :

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

到这样的东西:

if !epoch! LEQ %slice% del /f %%f

因此文件实际上被删除了

2 月:硬编码为 28 天。难忘的岁月真是令人难以置信。如果某人的想法是不添加 10 行代码,请继续发布,以便将其添加到我的代码中。

纪元:我没有考虑时间,因为需要删除的文件早于某个特定日期,如果花费数小时 / 分钟,则该文件会从保留的那一天删除。

局限性

纪元理所当然的,您的短日期格式为 YYYY-MM-DD。需要将其调整为其他设置或运行时评估(读取 sShortTime,用户绑定配置,在过滤器中配置适当的字段顺序并使用过滤器从参数中提取正确的数据)。

我是否提到我讨厌该编辑器的自动格式化?它删除了空白行,并且复制粘贴是一个地狱。

我希望这有帮助。