gpt4 book ai didi

date - 如何通过为同一日期的所有文件创建一个存档来存档超过 7 天的文件?

转载 作者:行者123 更新时间:2023-12-01 23:54:02 30 4
gpt4 key购买 nike

我正在寻找可以帮助我制定计划任务以自动将日志文件移动到 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 个日志文件,最后修改日期如下:

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.rar 包含 Oldest.logAlsoOld.log
  2. 25-07-2014_Logs.rar 包含 Sample1.logSample2.log
  3. 26-07-2014_Logs.rar 仅包含 Newest.log

24-07-2014 没有创建日志文件,因此也没有为这一天创建 RAR 存档。

最佳答案

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

"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 天的文件根据上次修改日期到一个 RAR 压缩文件中,其名称以 Logs_ 开头,当前日期以请求的格式和一个额外的递增以连字符后的数字 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 文件,其中那些 RAR 文件根据 Windows 资源管理器中的文件名按字母顺序排列会产生与那些 RAR 文件根据文件日期/时间在 Windows 资源管理器中列出时相同的列表.

获取文件名中日期格式为 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!

关于date - 如何通过为同一日期的所有文件创建一个存档来存档超过 7 天的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25079261/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com