用于将文件夹内容每月压缩到一个存档中然后删除的脚本

时间:2014-11-04 20:28:55

标签: batch-file 7zip winrar

我需要一个脚本来将包含子文件夹的目录内容备份到单个存档文件中。我想按月安排运行此脚本(将使用任务调度程序),因此每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
)

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

1 个答案:

答案 0 :(得分:2)

我建议使用以下两种解决方案之一并在一个月的最后一天使用 7-Zip 和任务计划程序运行 WinRAR 或批处理文件如果没有必要在一个档案中保存一个月的所有档案,则在午夜之前或每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\"

执行 WinRAR 时,ZIP存档的目标文件夹必须已存在。

WinRAR 的程序文件文件夹中,有文本文件 Rar.txt ,其中包含所有命令和开关,并附有控制台版本 Rar.exe的说明< / em>的。 WinRAR 的帮助在选项卡目录命令行模式上有子项命令切换 STRONG>。两者都可用于创建如上所示的命令行。

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

开关 -afzip 是一个 WinRAR 唯一的开关,它选择ZIP作为存档格式。 Rar.exe 不支持此开关,因为控制台版本仅支持创建RAR存档。

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

交换机 -ibck 会导致在归档处理时将 WinRAR 窗口最小化到Windows系统托盘。

开关 -cfg - 会导致忽略配置文件和RAR环境变量(仅为安全起见)。

交换机 -ep1 导致从归档中排除基本目录的整个路径,这导致不将“C:\ Temp \ Folder with Files and Subfolders压缩”到存档中,只是此文件夹中的文件和子文件夹。

开关 -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

首先,命令 FOR IF SET 用于处理Windows Management Instrumentation Command的输出以获取月份和年份。

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

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

或者,有关forifset的Microsoft TechNet文章,请参阅。

帮助其他命令 GOTO MD RD SETLOCAL 可以获得同样的方式

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

7-Zip 还有一个帮助,目录标签上的项目命令行版本包含子项命令< / strong>和切换

命令 a 用于将文件压缩到存档中。没有 m 作为 WinRAR 优惠。因此压缩后的删除必须单独进行。

选项 x = 9 的开关 -m 可设置最佳压缩效果。

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

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

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