【问题标题】: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
解释....
它将创建父目录下所有文件夹/子文件夹的 .rar 文件
文件夹 C:\MyPictures 在同一父文件夹中。
-
然后,它将删除父目录下的所有原始文件夹/子文件夹
文件夹 C:\MyPictures,因此您将只剩下档案
在同一个地方。
如果您想保留原始子文件夹,只需删除 -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
在哪里
【解决方案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