压缩当天的所有文件

时间:2017-03-05 09:06:02

标签: batch-file zip 7zip

我想每天将在同一天创建的文件(放入一个压缩文件夹)拉出并删除当天未压缩的文件。 我有这批用于压缩使用相同名称创建的文件:

@echo off
for %%A in ("E:\Logs\SmartLogger\*") do (if /I not "%%~xA" == ".zip" 7za.exe a -tzip -mx5 -y -- "%%~dpnA.zip" "%%~A" >nul && del /Q /F "%%~A")

如何更改它以忽略名称但尊重日期? 例如,如果我在一天创建的文件是:

doc1.dat
doc2.dat
doc3.dat

每天我都会创建这些文件,我想每天压缩它们。 我使用的是7zip btw

3 个答案:

答案 0 :(得分:1)

我的第一个建议是使用 WinRAR

此命令行可以直接用作计划任务命令行,也可以用作批处理文件。

"%ProgramFiles%\WinRAR\WinRAR.exe" m -afzip -agYYY-MM-DD -cfg- -ep1 -ibck -inul -m5 -tn1d -x*.zip -y -- "E:\Logs\SmartLogger\Logs_.zip" "E:\Logs\SmartLogger\*"

单击菜单项帮助主题帮助主题帮助 WinRAR 的GUI主窗口打开 WinRAR 的帮助包含选项卡内容列表项命令行模式以及帮助页面:

  • 命令行语法
  • 命令
    • 字母命令列表
  • <强>开关
    • 按字母顺序切换列表

可以使用这3个帮助页面轻松编写上述命令行,并阅读开关的帮助页面,这些页面似乎对当前的压缩/提取任务感兴趣。

请参阅按字母顺序切换列表以了解所使用的切换以及此单行如何完成整个作业。

我的第二个建议是使用 7-Zip ,这确实需要批处理文件,因为 7-Zip (版本16.04)没有依赖文件日期的开关(备份) /压缩)操作。

以下是我的解决方案,使用 7-Zip 将每个文件压缩为今天的最后修改日期为* .zip文件,文件名为Logs_YYYY-MM-DD.zip

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "ListFile=%TEMP%\ListFile.tmp"
del "%ListFile%" 2>nul

rem Get todays date in region and language dependent format required for
rem last modification date evaluation of all files in source directory.

echo Get todays file date.>"%TEMP%\GetTodaysFileDate.tmp"
for %%I in ("%TEMP%\GetTodaysFileDate.tmp") do set "Today=%%~tI"
set "Today=%Today:~0,-6%"
del "%TEMP%\GetTodaysFileDate.tmp"
echo Today is: "%Today%"

rem Set current directory being the directory with the files to process.
cd /D "E:\Logs\SmartLogger"

rem Search with DIR for files with todays date as last modification date
rem output by DIR sorted by last modification date with newest file first.
rem The found files with todays date are written into a list file. The
rem loop is exited if the first file is processed not having todays date.

for /F "delims=" %%I in ('dir /A-D /B /O-D /TW * 2^>nul') do (
    set "FileDate=%%~tI"
    set "FileDate=!FileDate:~0,-6!"
    if not "!FileDate!" == "%Today%" goto CompressFiles
    if /I not "%%~xI" == ".zip" echo %%I>>"%ListFile%"
)

:CompressFiles
if not exist "%ListFile%" goto EndBatch

rem Get todays date in a Windows region and language settings
rem independent format for usage in the ZIP file name.

for /F "skip=1 delims=." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime') do set "CurrentDate=%%I" & goto ReformatDate
:ReformatDate
set "ZipFileName=Logs_%CurrentDate:~0,4%-%CurrentDate:~4,2%-%CurrentDate:~6,2%.zip"

"%ProgramFiles(x86)\7-Zip\7z.exe" a -tzip -mx5 -scsDOS -sdel -y -- %ZipFileName% "@%ListFile%" >nul

del "%ListFile%"

rem Restore the environment (environment variables, current directory,
rem state of command extensions and delayed expansion) before calling
rem the command SETLOCAL at top of this batch file.

:EndBatch
endlocal

此批处理文件要求该文件夹与今天的日期相比,不包含将来最后修改日期的任何文件。此限制是由对日志文件在目录中找到的所有文件的文件日期的优化评估引起的。在 FOR 循环中删除goto CompressFiles行时不存在此限制。

另外 7-Zip 7-Zip 的程序文件文件夹中有一个7zip.chm的帮助文件,打开后双击包含在标签上列表项命令行版本下的目录帮助页

  • 语法
  • 命令打开命令行命令
  • 切换打开命令行开关

请首先检查运行此批处理文件的计算机上的行echo Today is: "%Today%"是否确实在为计划任务定义的用户帐户下输出了文件日期(没有或没有工作日),不包括空格字符和文件时间

使用的用户帐户的Windows区域和语言设置确定%%~tI的日期/时间格式。使用%%~tI的两个命令行下面的 SET 命令行可能必须经过调整才能在没有时间的情况下获得今天的日期。

也可以使用 WMIC 来获取每个文件的最后修改日期,如Find out if file is older than 4 hours in batch file上的回答所述,但这确实很慢,需要更多代码。

要了解使用过的Windows命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • cd /?
  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

另请阅读Microsoft有关Using Command Redirection Operators的文章,了解>nul2>nul的解释。

答案 1 :(得分:0)

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Try to change to target folder. Leave on error
    pushd "E:\Logs\SmartLogger" || goto :eof

    rem Retrieve the today date to use as zip file name
    set "today=" & for /f "tokens=1-3 delims=/ " %%a in ('
        robocopy "|" . /njh
    ') do if not defined today set "today=%%a-%%b-%%c"

    rem We need a temporary file to store the list of files to process
    set "listFile=%temp%\%~nx0.%random%%random%%random%%random%.tmp"

    rem Retrieve the list of files generated today and save to temp file
    >"%listFile%" forfiles /D 0 /M *.dat

    rem On sucess (files found) compress the list of selected files
    if not errorlevel 1 (
        7za -tzip -mx5 -y -- "%today%.zip" @"%listfile%"
    )

    rem On sucess remove the zipped files 
    if not errorlevel 1 (
        >nul 2>nul (
            for /f "usebackq delims=" %%a in ("%listFile%") do del /q /f "%%~fa"
        )
    )

    rem Remove the temporary file 
    2>nul del /q /f "%listFile%"

答案 2 :(得分:0)

我尝试使用MC ND的解决方案,但是当我使用@运算符时,它不起作用,找不到包含列表的文件。如果只有一个文件,它将起作用。

使用@listfile模式时,目标和源参数前的-参数导致了问题。

希望能帮助遇到相同问题的任何人