【问题标题】:Batch file to compress subdirectories用于压缩子目录的批处理文件
【发布时间】:2013-12-26 05:58:13
【问题描述】:

我正在尝试编写一个批处理脚本,该脚本将使用 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
    ...

如何编写脚本。

【问题讨论】:

    标签: windows batch-file compression 7zip winrar


    【解决方案1】:

    (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”开关在文件移动到存档后删除文件

    如果您想保留原始子文件夹,只需删除 -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
    

    在哪里

    • -存档或添加

    • -t 存档类型

    【讨论】:

      【解决方案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 的目录。

      【讨论】:

        【解决方案3】:

        感谢您提供的出色脚本,我刚刚遇到 3 个问题/更改 - 名称中带有空格的目录名称不起作用,我只想备份 1 级子目录,并且我想打包当前目录中的所有子目录(它是非常适合单独快速备份所有子目录)。如果您需要类似的东西,这里是修改:

        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"
        

        【讨论】:

          【解决方案4】:

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

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

          这将:

          • 保留文件夹结构,将每个 zip 放在各自的子目录中
          • 递归压缩目录中的所有文件(不包括空目录)
          • 用目录名命名 zips

          您还可以使用以下命令排除特定类型:

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

          【讨论】:

            【解决方案5】:

            所提供的解决方案都不适合我。我创建了一个脚本,它首先以最大压缩率打包到 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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-10-31
              • 2013-12-27
              • 1970-01-01
              • 1970-01-01
              • 2023-04-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多