【问题标题】:Script to compress contents of a folder once per month into an archive and then delete每月一次将文件夹内容压缩到存档中然后删除的脚本
【发布时间】:2014-11-04 20:28:54
【问题描述】:

我需要一个脚本来将包括子文件夹在内的目录的内容备份到单个存档文件中。我想按月计划运行此脚本(将使用任务计划程序),因此脚本每 30 天压缩文件夹的内容并创建一个以月份为文件名的新存档文件,然后删除文件/子文件夹。

我把我在网上找到的代码组合在一起,这就是产品。代码按要求运行,只是不确定逻辑是否存在。

for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x

IF %month%==1 (
SET mth=Jan
)    
IF %month%==2 (
SET mth=Feb
)    
IF %month%==3 (
SET mth=Mar
)
IF %month%==4 (
SET mth=Apr
)    
IF %month%==5 (
SET mth=May
)   
IF %month%==6 (
SET mth=Jun
)   
IF %month%==7 (
SET mth=Jul
)    
IF %month%==8 (
SET mth=Aug
)    
IF %month%==9 (
SET mth=Sep
)    
IF %month%==10 (
SET mth=Oct
)    
IF %month%==11 (
SET mth=Nov
)    
IF %month%==12 (
SET mth=Dec
)

for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%mth%-%Year%.zip" "%%X\"    

IF EXIST %mth%-%Year%.zip (
    FOR /D %%p IN ("*") DO rmdir "%%p" /s /q
) ELSE (
    echo NO
)

如果有人可以帮助我优化或改进此代码,我将不胜感激。

【问题讨论】:

  • 你到底使用什么代码?到目前为止,您尝试了哪些方法来达到您想要的结果?
  • 我建议您重新阅读线程并查看 7z 的命令行选项(已接受答案中的第二个解决方案)以将多个文件压缩到一个存档中,可以使用 windows 任务调度程序来完成调度。这也不是应该在 SO 上提出的问题类型,因为您没有任何代码,只是寻求一般建议
  • @SBH - 代码必须是 VB、powershell 或某种形式的 windows Batch.. 我还没有找到任何适合我需要的东西。到目前为止我发现的一切都很接近,但不是我需要的。
  • 对不起,但 SO 不能那样工作。请向我们展示您迄今为止所做的尝试,以及您需要帮助解决的具体问题。
  • 我尝试使用的代码是for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.zip" "%%X\" 问题是上面的代码为目录中的每个子文件夹创建了一个单独的压缩文件。我只需要创建 1 个包含所有子文件夹的 zip 文件。

标签: batch-file 7zip winrar


【解决方案1】:

我建议使用以下两种解决方案之一,并在一个月的最后一天运行 WinRAR 或使用带有任务计划程序的 7-Zip 的批处理文件几分钟在午夜之前,或者如果确实没有必要将一个月的所有文件放在一个存档中,则每 30 天一次。

阅读以下有关解决方案之前的注意事项:

不要在包含要存档的文件和子文件夹的文件夹中创建 ZIP 存档。将解决方案与 7-Zip 一起使用并不是一个好主意。


WinRAR 解决方案

我对这个任务的第一个解决方案是使用 WinRAR,这使得这个任务变得单行:

"C:\Program Files\WinRAR\WinRAR.exe" m -afzip -agMMM-YYYY -ibck -cfg- -ep1 -m5 -r "C:\Path to Destination Folder of Archive\.zip" "C:\Temp\Folder with Files and Subfolders to compress\"

ZIP 压缩包的目标文件夹在执行 WinRAR 时必须已经存在。

WinRAR的程序文件夹中有一个文本文件Rar.txt,其中包含所有命令和开关以及控制台版本的说明Rar.exe。 WinRAR 的帮助在 Contents 选项卡上有 Command line mode 项和子项 CommandsSwitches强>。两者都可以用来创建类似上面的命令行。

命令 m 解释了移动文件和目录,这导致文件和目录在打包操作成功完成后被删除。

-afzip 开关是 WinRAR 专用开关,它选择 ZIP 作为存档格式。 Rar.exe 不支持此开关,因为控制台版本仅支持创建 RAR 压缩包。

带有选项 MMM-YYYY 的开关 -ag 会导致在文件扩展名之前以短名称格式附加月份和年份,例如2014 年 11 月

开关 -ibck 导致在存档处理时将 ​​WinRAR 窗口最小化到 Windows 系统托盘。

-cfg- 开关会导致忽略配置文件和 RAR 环境变量(仅出于安全考虑)。

开关 -ep1 导致从存档中排除到基目录的整个路径,这导致此处没有将“C:\Temp\Folder with Files and Subfolders to compress\”放入存档中,只是此文件夹中的文件和子文件夹。

开关 -m5 为存档设置最佳压缩。

开关 -r 非常重要,因为它告诉 WinRAR 递归压缩所有文件和文件夹。

所创建的存档文件例如是 Nov-2014.zip,因为存档文件的名称就是 .zip

WinRAR 许可证投入少量资金可以使许多存档和备份任务变得非常简单。

当然,也可以创建 RAR 存档而不是 ZIP 存档。


7-Zip 解决方案

7-Zip 解决方案需要更多努力,因为目前没有像 WinRAR 这样的功能来执行此类备份任务。

@echo off
setlocal EnableDelayedExpansion
for /f %%x in ('wmic path win32_localtime get /format:list') do (
    set "Value=%%x"
    if "!Value:~0,5!"=="Month" (
        set "Month=!Value:~6!"
    ) else if "!Value:~0,4!"=="Year" (
        set "Year=!Value:~5!"
    )
)
if "%Month%"=="1"  set "Month=Jan" & goto Compress
if "%Month%"=="2"  set "Month=Feb" & goto Compress
if "%Month%"=="3"  set "Month=Mar" & goto Compress
if "%Month%"=="4"  set "Month=Apr" & goto Compress
if "%Month%"=="5"  set "Month=May" & goto Compress
if "%Month%"=="6"  set "Month=Jun" & goto Compress
if "%Month%"=="7"  set "Month=Jul" & goto Compress
if "%Month%"=="8"  set "Month=Aug" & goto Compress
if "%Month%"=="9"  set "Month=Sep" & goto Compress
if "%Month%"=="10" set "Month=Oct" & goto Compress
if "%Month%"=="11" set "Month=Nov" & goto Compress
set "Month=Dec"

:Compress
set "FolderToCompress=C:\Temp\Folder with Files and Subfolders to compress"
"C:\Program Files\7-Zip\7z.exe" a -mx=9 -r -tzip "C:\Path to Destination Folder of Archive\%Month%-%Year%.zip" "%FolderToCompress%\*"
rd /S /Q "%FolderToCompress%"
md "%FolderToCompress%"
endlocal

首先,FORIFSET命令用于处理Windows Management Instrumentation Command的输出,得到月份和年份。 p>

有关在命令提示符窗口(控制台窗口)中运行的这 3 个命令的帮助

  • help forfor /?
  • help ifif /?
  • help setset /?

或阅读有关forifset 的 Microsoft TechNet 文章以了解详细信息。

其他命令 GOTOMDRDSETLOCAL 的帮助可以相同的方式获得.

确定存档文件名的月份和年份后,执行 7-Zip 在目标文件夹中创建一个 ZIP 文件,该文件夹当然必须已经存在。

还有 7-Zip 有一个帮助,在 Contents 选项卡上有 Command Line Version 项和子项 Commands 和 开关

a 命令用于将文件压缩到存档中。 WinRAR 没有提供 m。所以压缩后的删除必须单独进行。

带有选项 x=9 的开关 -m 设置最佳压缩。

开关 -r 非常重要,因为它告诉 7-Zip 递归压缩所有文件和文件夹。

并且开关-tzip选择标准的ZIP格式。

使用命令 RD 删除包含所有文件和子文件夹的文件夹“C:\Temp\Folder with Files and Subfolders to compress\”,然后使用 MD文件夹本身被重新创建,因为我认为该文件夹本身应该在下个月保留。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多