【问题标题】:Delete all files older than 1 day / 24hours using creation date?使用创建日期删除所有早于 1 天/24 小时的文件?
【发布时间】:2014-03-28 10:45:57
【问题描述】:

我想使用操作系统中的定时任务和批处理文件删除所有早于 1 天/24 小时的文件。

这是我实现的简单备份机制所必需的,它每小时保存一个特定文件,我不想手动删除旧文件。

我已经实现了以下批处理代码,它每小时成功创建一个备份。但是,代码的删除部分似乎不起作用。

有人对原因有什么建议吗?

PS:我使用的是 Win7 x64。

代码:

rem Get day of week
SETLOCAL enabledelayedexpansion
SET /a count=0
FOR /F "skip=1" %%D IN ('wmic path win32_localtime get dayofweek') DO (
if "!count!" GTR "0" GOTO next
set dow=%%D
SET /a count+=1
)

:next

rem Check if day of week is Saturday or Sunday. If so, goto end of file.
if %dow% == 6 GOTO eof
if %dow% == 7 GOTO eof

rem Set hour
set TIMESTAMP=%TIME:~0,2%"Uhr"

rem Copy file including timestamp
xcopy "SOURCE FOLDER" "TARGET FOLDER\filename_%date%_%TIMESTAMP%.accdb*" /Y

rem Delete files older than 1 day
forfiles -p "TARGET FOLDER (from above)" -s -m *.* /D -1 /C "cmd /c del @path"


:eof

编辑:

我找到了原始问题的原因,它是 UNC 路径。我现在没有使用它们,而是将路径映射到驱动器号,现在删除工作正常。

但是,它现在会删除我的所有文件,而不仅仅是超过 1 天的文件。

我怀疑 forfiles 使用最后修改日期而不是创建日期,因为最后修改仍然是 26 日,而创建时间就像一个小时前...

有没有办法规避这种行为并改用创建日期?

或者,有没有办法在复制文件后将修改日期设置为某个时间戳?

【问题讨论】:

  • 注意! forfiles /D 仅查找日期,而不是时间。因此,如果您在午夜后不久运行它,它可能会处理仅 10 分钟前的文件。只是提一下,因为您写的是早于 1 天/24 小时
  • 啊,我想我找到了原因... Forfiles 显然不支持 UNC 路径 -.- 你知道吗?写什么而不是 /D ?
  • 只是一个问题。您是否确实需要删除超过 24 小时的文件,或者删除不是当天的文件就足够了?如果可以选择第二种情况,请删除日期与今天不同的所有文件。
  • 我想备份最后 24 小时,所以是的,我需要删除所有早于 24 小时的内容

标签: windows batch-file command-line cmd delete-file


【解决方案1】:

我能够通过使用 dbenham 的 getTimestamp.bat 解决问题:http://www.dostips.com/forum/viewtopic.php?f=3&t=4847&p=27422#p27422

这是我能找到的唯一一个能够计算昨天日期的工作批处理文件(可能是任何一天)。

它可能是唯一有效的,因为所有其他人(以及所有在有关 StackOverflow 线程中链接的人)都没有考虑语言环境设置,所以他们甚至没有为我启动。

call getTimeStamp -od -1 -f {dd}.{mm}.{yyyy} -r dt

rem Copy file including timestamp
xcopy "\\unc\folder\fileToBackup.accdb" "\\unc\folder\backupedFile_%date%_%TIMESTAMP%.accdb*" /Y

rem Delete yesterdays file
del "\\unc\folder\backupedFile_%dt%_%TIMESTAMP%.accdb*"

【讨论】:

  • 如您的问题所述,这如何考虑创建日期?创建日期是文件系统中文件的时间戳,而不是文件名的一部分。
  • 它没有,我不得不使用不同的方法(参见另一个答案的 cmets)。我认为没有任何方法可以考虑创建日期,但是,如果您以他们的名义为复制的文件添加时间戳,则实际上不需要它
【解决方案2】:

可能有点“复杂”,但这应该可以完成工作

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "folder=\\server\share\somewhere"

    for /f "tokens=*" %%a in (
        'robocopy "%folder%" "%folder%" /l /nocopy /is /minage:1 /njh /njs /ndl /ns /nc /fp'
    ) do echo del "%%a"

del 命令回显到控制台。如果输出正确,去掉echo命令。

它使用robocopy 命令在UNC 路径中搜索所需的文件。因此,本机仅适用于 vista 和更高版本的操作系统。对于 XP,Windows 2003 资源工具包工具包括 robocopy 的工作版本。

已编辑 - 又一个。试图避免文件上的时间戳

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "folder=\\server\share\somewhere"

    for /f "tokens=* skip=24" %%a in (
        'dir /b /a-d /tc /o-d "%folder%"'
    ) do echo del "%folder%\%%a"

每小时生成一个文件,保留最后的 24 个并删除其余的。

【讨论】:

  • 感谢您的努力,但是,您的脚本有完全相同的问题...似乎使用“最后修改”日期而不是创建日期。因此删除了太多文件。
  • 我现在可能会尝试不同的方法。我想如果我能够定义一个存储昨天日期的变量(%date% - 1 或其他东西),那么我可以删除文件“filename_%yesterday%_%TIMESTAMP%.accdb*”,一切都应该正常,因为我什至不需要时间戳。
  • @daZza,这就是我最初评论的原因,询问是否足以考虑今天以外的文件。你甚至不需要得到昨天。有今天日期,删除所有没有今天日期的文件。
  • 不,你的想法行不通。总是有两天的备份,因为我总是需要最新的 24 小时......
  • 进一步解释:在 01.04.2014 的 11:00,我意识到发生了一些错误,并且可以将原因追溯到 12 小时前所做的更改,所以在 2014 年 3 月 31 日 23 :00。如果我使用你的方法,我无法在 12 小时后恢复备份,因为文件已经被删除,因为它们来自不同的一天(31.03 与 01.04)。
【解决方案3】:

forfiles 确实使用 modified 时间戳,而不是 created 时间戳,因此您无法将其用于您想要的。

您可能想检查this question 的答案,它在批处理脚本中解析文件创建日期,或者如果您愿意使用 PowerShell,那么您可以尝试this script 与参数-CreateTime 选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    相关资源
    最近更新 更多