Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 压缩子目录的批处理文件_Windows_Batch File_Compression_7zip_Winrar - Fatal编程技术网

Windows 压缩子目录的批处理文件

Windows 压缩子目录的批处理文件,windows,batch-file,compression,7zip,winrar,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

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

(1)使用WinRAR:

WinRAR
包括两个命令行工具,
rar.exe和unrr.exe
,其中rar.exe压缩文件,unrr.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
@echo off
setlocal
for /d %%x in (C:\MyPictures\*.*) do "C:\Program Files\7-Zip\7z.exe" a -tzip "%%x.zip" "%%x\"
endlocal
exit
解释……

  • 它将创建父文件夹下所有文件夹/子文件夹的.rar文件 文件夹C:\MyPictures位于同一父文件夹中

  • 然后,它将删除父文件夹下的所有原始文件夹/子文件夹 文件夹C:\MyPictures,因此您将只剩下归档文件 在同一个地方

    • “a”命令添加到存档中

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

    • “-u”开关。与“a”组合时相当于“u”命令 指挥部。添加新文件并更新文件的旧版本 已经在档案中了

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

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

    (2)使用7-Zip:

    7-Zip
    是具有高压缩比的文件归档程序。
    7z.exe
    是7-Zip的命令行版本。 7-Zip不使用系统通配符解析器,也不遵循使用通配符的古老规则。指任何文件。7拉链餐点。与具有扩展名的任何文件的名称匹配。 要处理所有文件,必须使用*通配符

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

    @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
    
    @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型档案


    以下是如何在7-zip中实现这一点

    假设您的文件位于文件夹

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

    对于(c:\Pictures\*.*中的/D%%i,请执行“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个问题/更改-名称中有空格的目录名不起作用,我只想备份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"
    

    如果需要递归地压缩windows中所有子文件夹中的文件,另一种方法是使用以下方法:

    • 如果安装了git,请右键单击并选择“git Bash Here”
    • 类型<代码>查找*-类型d-空-execdir sh-c'cd“$1”和&7z a“$1”.7z-x!*/&cd-‘sh{}\
    这将:

    • 保留folderstructure,将每个拉链放在相应的子文件夹中
    • 递归压缩目录中的所有文件(不包括空目录)
    • 名称与目录名齐头并进
    您还可以使用以下选项排除特定类型:

    find*-type d-execdir sh-c'cd“$1”和&7z a“$1”。7z-x!*/-x!*。7z-x!*。zip和cd-'sh{}\;
    
    提供的解决方案中没有一个适合我。我创建了一个脚本,该脚本首先以最大压缩率打包到7z中,然后为具有恢复记录的存储创建rar归档(它还删除临时7z归档):