用于压缩子目录的批处理文件

时间:2013-12-26 05:58:14

标签: windows batch-file compression 7zip winrar

我正在尝试编写一个批处理脚本,它将使用winrar或7-zip自动压缩子目录:

示例:

 My Pictures
    Pics1 (Pics1.zip)
        File1.jpg
        File2.jpg
        File3.jpg
    Pics2 (Pics2.zip)
        File4.jpg
        File5.jpg
    Pics3 (Pics3.zip)
        File6.jpg
        File7.jpg
    ...

我如何编写脚本。

5 个答案:

答案 0 :(得分:5)

(1)使用WinRAR:

WinRAR包括两个命令行工具rar.exe and unrar.exe,其中rar.exe压缩并且unrar.exe解压缩文件。

两者都位于可安装版本的C:\Program Files\WinRAR文件夹中。

假设,如果C:\MyPictures下有多个子文件夹,并且您希望每个子文件夹都在父文件夹中获取自己的.rar文件。

从批处理文件中,这适用于您:

@echo off
setlocal
set zip="C:\Program Files\WinRAR\rar.exe" a -r -u -df
dir C:\MyPictures /ad /s /b > C:\MyPictures\folders.txt
for /f %%f in (C:\MyPictures\folders.txt) do if not exist C:\MyPictures\%%~nf.rar %zip% C:\MyPictures \%%~nf.rar %%f
endlocal
exit

<强>解释....

  1. 它将创建父级下所有文件夹/子文件夹的.rar文件 文件夹C:\ MyPictures在同一个父文件夹中。

  2. 然后,它将删除父级下的所有原始文件夹/子文件夹 文件夹C:\ MyPictures,因此您只能留下档案     在同一个地方。

    • “a”命令添加到存档

    • “ - r”开关递归子文件夹

    • “ - u”切换。与“a”结合使用时相当于“u”命令 命令。添加新文件并更新旧版本的文件 已经存档

    • “ - df”开关在将文件移动到存档后删除文件

  3. 如果您想保留原始子文件夹,只需删除-df switch

    (2)使用7-Zip:

    7-Zip是一个压缩比高的文件存档程序。7z.exe是7-Zip的命令行版本。 7-Zip不使用系统通配符解析器,它不遵循表示任何文件的古老规则。 7-Zip将视为与具有扩展名的任何文件的名称相匹配。 要处理所有文件,您必须使用*通配符。

    在批处理文件中使用7zip命令行选项,下面适用于您:

    @echo off
    setlocal
    for /d %%x in (C:\MyPictures\*.*) do "C:\Program Files\7-Zip\7z.exe" a -tzip "%%x.zip" "%%x\"
    endlocal
    exit
    

    <强>其中

    • -a archive或add

    • -t档案类型

答案 1 :(得分:2)

以下是7-zip中的操作方法。

假设您的文件位于文件夹C:\Pictures\中。然后,您可以使用以下批处理命令创建多个与目录同名的存档。

FOR /D %%i IN (c:\Pictures\*.*) DO "c:\Program Files\7-Zip\7z.exe" a "%%i.zip" "%%i\"

这将压缩目录Pictures中的每个文件夹。将c:\Pictures更改为包含您的文件夹的目录。如果将7-zip安装到其他目​​录,请将"c:\Program Files\7-Zip\7z.exe"更改为安装了7-zip的目录。

答案 2 :(得分:0)

感谢您提供优秀的脚本,我只有3个问题/更改 - 名称中包含空格的目录名称无效,我只想备份1级子目录,我想将所有子目录打包到当前目录中(它& #39;非常适合单独快速备份所有子目录)。如果你需要类似的东西,这是修改:

set zip="C:\Program Files\WinRAR\rar.exe" a -r -u -df
dir /b /o:n /ad > .\folders.txt
for /F "tokens=*" %%A in (.\folders.txt) do if not exist ".\%%~nA.rar" %zip% ".\%%~nA.rar" "%%A"

答案 3 :(得分:0)

如果您需要在窗口的所有子目录中递归压缩文件,另一种方法是使用gitbash和描述here的方法:

  • 如果您安装了git,请右键单击并选择“Git Bash Here”
  • 输入find * -type d ! -empty -execdir sh -c 'cd "$1" && 7z a "$1".7z -x!*/ && cd -' sh {} \;

这将:

  • 保留文件夹结构,将每个zip放在相应的子目录
  • 递归压缩dirs中的所有文件(不包括空目录)
  • 目录名称为
  • 的拉链

您还可以使用以下方法排除特定类型:

find * -type d -execdir sh -c 'cd "$1" && 7z a "$1".7z -x!*/ -x!*.7z -x!*.zip && cd -' sh {} \;

答案 4 :(得分:0)

没有提供的解决方案对我有用。我创建了一个脚本,该脚本首先以最大压缩率打包到 7z 中,然后创建 rar 存档以存储恢复记录(它还会删除临时7z存档):

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

FOR /R f:\ZA\SQL2005\ZA\ %%A IN (*.*) DO (
    SET "file_without_suffix=%%~dpnA"

    7z.exe a -t7z -m0=lzma2 -mx=9 -mfb=256 -md=1024m -ms=on "!file_without_suffix!.7z" "%%A"
    REM -ep1 do not store path in archive
    rar.exe a -m0 -rr -ep1 "!file_without_suffix!.rar" "!file_without_suffix!.7z"
    DEL /Q /F "!file_without_suffix!.7z"
    SET "file_without_suffix="
)

SETLOCAL DISABLEDELAYEDEXPANSION