使用创建日期删除超过1天/ 24小时的所有文件?

时间:2014-03-28 10:45:57

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

我想使用操作系统中的定时任务和批处理文件删除超过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日,而创建就像一小时前......

有没有办法绕过这种行为并改为使用创建日期?

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

3 个答案:

答案 0 :(得分:0)

也许有点"令人费解的"但这应该做的工作

@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个文件并删除其余文件。

答案 1 :(得分:0)

我能够通过使用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*"

答案 2 :(得分:0)

forfiles确实使用已修改的时间戳,而不是已创建的时间戳,因此您无法将其用于所需内容。

您可能希望查看this question的答案,该答案在批处理脚本中解析文件创建日期,或者如果您愿意使用PowerShell,那么您可以尝试this script使用参数{{ 1}}选项。