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
    ...

我如何编写脚本。

4

5 回答 5

6

(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. 它将在同一父文件夹中的父文件夹 C:\MyPictures 下创建所有文件夹/子文件夹的 .rar 文件。

  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 归档类型

于 2013-12-26T06:46:38.680 回答
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 的目录。

于 2013-12-26T07:04:32.180 回答
0

感谢您提供出色的脚本,我刚刚遇到 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"
于 2017-02-24T10:59:43.437 回答
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
于 2019-05-03T09:53:55.540 回答
0

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

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

这将:

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

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

find * -type d -execdir sh -c 'cd "$1" && 7z a "$1".7z -x!*/ -x!*.7z -x!*.zip && cd -' sh {} \;
于 2018-03-20T09:59:21.090 回答