批处理文件压缩子目录

5

我正在尝试编写一个批处理脚本,自动运行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个回答

7

(1) 使用WinRAR:

WinRAR 包括两个命令行工具: rar.exe 和 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. 它将在父文件夹C:\MyPictures下的所有子文件夹中创建.rar文件,这些文件将与父文件夹位于同一目录。

  2. 然后,它将删除父文件夹C:\MyPictures下的所有原始子文件夹,这样您只留下了相应的存档。

    • "a"命令用于添加到存档

    • "-r"选项遍历子文件夹

    • "-u"选项。当与"a"命令结合使用时,相当于"u"命令。添加新文件并更新存档中已有文件的旧版本

    • "-df"选项在移动到存档后删除文件

如果要保留原始子文件夹,只需删除-df开关

(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 归档或添加

  • -t 存档类型


2

以下是使用7-zip的步骤。

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

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

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


0
感谢您提供这个优秀的脚本,我只有三个问题/更改需要解决 - 目录名称中带有空格的无法正常工作,我只想备份一级子目录,并且我想将所有子目录打包在当前目录中(这对于快速备份所有子目录非常方便)。如果您需要类似的修改,请参考以下代码:
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"

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

0

如果你需要在Windows中递归地压缩所有子目录中的文件,另一种方法是使用gitbashhere所描述的方法:

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

这将:

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

您还可以通过以下方式排除特定类型:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接