我想使用操作系统中的定时任务和批处理文件删除超过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日,而创建就像一小时前......
有没有办法绕过这种行为并改为使用创建日期?
或者,有没有办法在复制文件后将修改日期设置为某个时间戳?
答案 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}}选项。