如何为所有具有相同日期的文件创建一个存档,以存档超过7天的文件?

时间:2014-08-01 11:28:54

标签: date batch-file task winrar

我正在寻找可以帮助我制定计划任务以自动将日志文件移动到RAR档案中的人。

它不一定是批处理文件解决方案,如果您有其他想法请分享。

我得到了它的基本代码。这是我到目前为止的批处理文件代码:

"C:\Program Files\WinRAR\rar.exe" a -ag -ms "D:\tet\Web3811\Web3811\LogsBackup\" @backup.txt

批处理文件中的该行运行 RAR ,以创建包含列表文件backup.txt中指定的文件夹中所有文件的存档:

D:\tet\Web3811\Web3811\log

RAR存档在D:\tet\Web3811\Web3811\LogsBackup\中创建,yyyy-mm-dd.rar为文件名。

我需要帮助:

  1. RAR档案的格式应为dd-mm-yyyy格式的日期,而不是yyyy-mm-dd
  2. 根据最后修改日期,只有7天以上的日志文件与当前日期相比,时间无关紧要,只有日期。如果当前日期和时间是02-08-2014 12:30:00,则应将所有具有27-07-2014 00:00:00之前的日期和时间的文件添加到RAR档案中。
  3. 要创建的每个RAR存档应仅包含具有相同上次修改日期的文件。
  4. 一旦RAR压缩完成且没有错误,应删除所有存档日志文件。
  5. 作为批处理文件的原因是要求可以作为计划任务执行。

    第三项要求的一个例子:

    该文件夹包含5个日志文件,其中包含以下最后修改日期:

    Oldest.log    23-07-2014 02:20:54
    AlsoOld.log   23-07-2014 23:52:26
    Sample1.log   25-07-2014 09:08:46
    Sample2.log   25-07-2014 12:59:02
    Newest.log    26-07-2014 18:32:48
    

    计划任务需要创建3个包含以下名称和文件的存档:

    1. 23-07-2014_Logs.rarOldest.logAlsoOld.log
    2. 25-07-2014_Logs.rarSample1.logSample2.log
    3. 26-07-2014_Logs.rar只有Newest.log
    4. 在24-07-2014没有创建日志文件,因此也没有为今天创建的RAR存档。

1 个答案:

答案 0 :(得分:3)

我建议在批处理文件中使用:

"C:\Program Files\WinRAR\rar.exe" mf -ac -ao -agDD-MM-YYYY-NN -ep1 -idq -m5 -to7d -y "D:\tet\Web3811\Web3811\LogsBackup\Logs_" @backup.txt

以上命令将根据上次修改日期超过7天的所有文件移动到名称以Logs_开头的RAR存档中,并以请求的格式显示当前日期,以及以...开头的其他递增编号如果在一天内多次运行此命令行,则在连字符后面加1号。

仅将具有存档属性的文件移动到存档中。归档文件后归档归档属性即使无法删除,例如当另一个应用程序使用写锁定打开文件时也是如此。 RAR 不会删除读取和压缩数据的文件(读锁定)。

请参阅 WinRAR 的程序文件文件夹中的文本文件 Rar.txt ,以获取此命令行中使用的所有开关的说明。


在更好地解释了一些要求之后,这里有一个批处理文件来创建最终请求的存档文件。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem Define the directories to use for backup task.
set "LogDirectory=D:\tet\Web3811\Web3811\log"
set "BakDirectory=D:\tet\Web3811\Web3811\LogsBackup"

rem Get all file names in log directory into a list file sorted by last
rem modification date with oldest file at top and newest at bottom.
rem Note: /S is important to get the file names with complete path.
dir "%LogDirectory%\*" /A-D /B /OD /S /TW 1>"%BakDirectory%\LogFiles.lst" 2>nul
rem Jump to clean up stage if no file found in the log directory.
if errorlevel 1 goto :CleanUp

rem Delete list file for all files with same day if file exists
rem for example from a previous execution of this batch file
rem which was terminated manually by a user during execution.
if exist "%BakDirectory%\DayFiles.lst" del "%BakDirectory%\DayFiles.lst"

set LastDate=none
for /F "usebackq delims=" %%F in ( "%BakDirectory%\LogFiles.lst" ) do (

   set FileTime=%%~tF

   rem Get just file date from file time in format DD-MM-YYYY.
   rem The file time string format depends on date and time
   rem format definition in Windows language settings.
   rem Therefore the line below must be adapted if date format
   rem is whether DD.MM.YYYY nor DD-MM-YYYY nor DD/MM/YYYY.
   set FileDate=!FileTime:~0,2!-!FileTime:~3,2!-!FileTime:~6,4!

   rem Is the last modification date of this file different
   rem to last modification date of the previous file?
   if not "!FileDate!"=="!LastDate!" (
      rem Nothing to archive on first difference.
      if not "!LastDate!"=="none" call :ArchiveLogs
      rem Exit loop if RAR has not archived any file which means
      rem all other files are modified within the last 7 days.
      if "!LastDate!"=="ExitLoop" goto CleanUp
      rem Start creating a new list.
      set LastDate=!FileDate!
   )
   rem Append name of this file with path to current day list.
   echo %%F>>"%BakDirectory%\DayFiles.lst"
)

rem Jump to clean up stage if no list file with files to archive.
if not exist "%BakDirectory%\DayFiles.lst" goto CleanUp

rem Otherwise with no log file created or modified within
rem the last 7 days, but at least one older file exists
rem nevertheless, archive all those files in list file.
call :ArchiveLogs

:CleanUp
del "%BakDirectory%\LogFiles.lst"
endlocal
goto :EOF

:ArchiveLogs
rem Move all files in the list file older than 7 days without
rem path using best compression into a RAR archive with last
rem modification date of archived file(s) in RAR file name.
"C:\Program Files\WinRAR\Rar.exe" mf -ep1 -idq -m5 -to7d -y "%BakDirectory%\!LastDate!_Logs.rar" "@%BakDirectory%\DayFiles.lst"
rem Exit FOR loop above if no file archived because
rem no file in the list file is older than 7 days.
if errorlevel 10 set LastDate=ExitLoop
del "%BakDirectory%\DayFiles.lst"

我首先想到,如果不编写小型控制台应用程序来创建每个日期的文件列表并忽略过去7天内未修改的文件,则无法执行此操作。但后来我对如何使用批处理文件以及 RAR 解决了这个主要问题有了一个想法,如上所示。

最好在午夜之后运行此批处理文件,其中计划任务很短,因为 RAR 也考虑了当前时间,超过7天"而不只是约会。

但是如果批处理文件例如在18:00执行并且在23:00分别创建了分别修改的日志文件则没有问题。在这种情况下,最后修改日期为18:00之前的日志文件以及与当前日期相比恰好在7天之前的日期将首先移动到RAR存档中,并在第二天将其他日志文件在18:00之后最后一次修改为日期也会移动到此日期的RAR存档。

总是在18:00执行批处理任务的示例以及会发生什么。

有日志文件

FirstSundayAugust2014_1.log   03/08/2014 15:23
FirstSundayAugust2014_2.log   03/08/2014 23:48

,计划任务将于2014年8月10日星期日18:00开始。

批处理文件将FirstSundayAugust2014_1.log移动到RAR存档03-08-2014_Logs.rar,但同样来自上一个星期日的其他日志文件FirstSundayAugust2014_2.log仍保留在目录中。

在2014年8月11日星期一18:00,批处理文件也将FirstSundayAugust2014_2.log移动到RAR存档03-08-2014_Logs.rar,此存档现在包含分别在2014年8月第一个星期日修改的两个日志文件

还有一点需要注意:

日期格式为DD-MM-YYYY的RAR文件名在我看来并不是很好。更好的是YYYY-MM-DD,因为这导致* .rar文件,其中根据Windows资源管理器中的文件名按字母顺序列出的那些RAR文件将导致与在Windows资源管理器中根据文件日期/时间列出这些RAR文件时相同的列表

获取格式为YYYY-MM-DD的RAR文件作为文件名中的日期行

set FileDate=!FileTime:~0,2!-!FileTime:~3,2!-!FileTime:~6,4!

需要修改为

set FileDate=!FileTime:~6,4!-!FileTime:~3,2!-!FileTime:~0,2!