如何为7zip中的每个选定文件/目录创建单独的zip文件?


30

这是Total Commander的内部zip包装器:

Total Commander zip packer对话框的图片。

但是我想使用我的7zip包装器。当我选择5个文件时,每个选定的文件都有5个单独的.zip存档。如何在7zip中做到这一点?

Answers:


54

我不确定您可以使用图形用户界面执行建议的操作,但是您当然可以从命令行执行以下操作:

FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"

您需要首先将目录(cd命令)更改为F:\Downloads目录,或者将要执行批量压缩的目录更改为该目录。同样,很容易替换为* .exe或您想要过滤的任何扩展名以仅压缩那些文档。

秘密解码器响起:

  • %i 是一个变量,用于保存循环中每个步骤的文件名
  • (*.*) 是选择标准,它很容易是* .exe或类似名称
  • 7z.exe 是7-Zip的命令行版本
  • %~ni -这会将%i变量扩展为仅文件名-无扩展名

如果只想为给定目录添加文件夹,则命令会稍微复杂一些,因为默认情况下,FOR只适用于文件。我们需要向它提供一些其他信息:

FOR /F "usebackq delims=?" %i IN (`DIR /B /A:D`) DO 7z.exe a "%i.7z" "%i"

之所以起作用,是因为有几处看起来像魔术的东西:

  • /F 告诉FOR迭代()中的扩展值
  • usebackq 告诉FOR我将要传递命令并使用输出进行迭代
  • delims=?告诉FOR我想将令牌分开?-文件名和目录中的非法字符。我只想要一个令牌。
  • 输入/BDIR裸格式 -只是名称
  • /A:DDIR是限制通过属性的效果,d是目录

如果要将其封装在批处理文件中,则唯一需要做的更改是对%i变量进行两次转义:

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"

是的,除了您的是7z存档,我想要一个zip存档!那么%〜ni.zip呢?
脾气暴躁的熊

更好的是,我想要具有超压缩功能的zip或7z。并将其打包在d:\ packed中。但是到目前为止,您的方法有效!
脾气暴躁的熊

1
收到了。谢谢!对于%i IN(),请在7z.exe中输入“ i:\ packed \%〜ni.7z”“%i” -mx9
脾气暴躁的小熊

顺便说一句,您能告诉我如何在批处理文件中执行此操作吗?即sperate-archive.bat
脾气暴躁的熊

谢谢,如何将整个文件夹添加到该脚本中?
脾气暴躁的熊

15

我喜欢Goyuix的答案。但是,如果您使用的是Windows 7(或已安装Power Shell),并且还使用命令行版本的7-zip 7za.exe,则可以运行以下命令:

dir | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

您也可以将“ dir”更改为“ dir * .exe”以仅选择可执行文件。

关于Power Shell的一件好事是,您正在使用对象而不是字符串。因此,如果您愿意,您可以变得非常具体。例如:

dir *.csv | ? { $_.Length -lt 18900 -and $_.LastWriteTime -ge [DateTime] "07/01/2011" } | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

这仅包括以下文件:

  1. 具有csv扩展名
  2. 小于18,900字节
  3. 最后修改时间:2011年7月1日或之后

编辑 如果要压缩文件而不是7-zip文件,请改用InfoZip的zip.exe


4
7-zip也可以创建zip文件-查看-t标志。示例:7z a -tzip archive.zip *.exe
Goyuix 2011年

好的,$ _。BaseName $ _。Name可以,但是如何在另一个目录的另一个驱动器上执行$ _。BaseName $ _。Name呢?说f:\ test \ file1.7z等
脾气暴躁的小熊

0

您可以从http://www.ghisler.com/plugins.htm下载并安装Total Commander的7zip插件 一旦您在屏幕快照的窗口右侧执行了此操作,就会选择7zip压缩。使用该选项,您可以完全满足您的要求。


0

我刚刚一直在解决这个问题,发现的问题之一是存档中文件夹名称的重复,即,压缩名为“ foo”的文件夹时,.\foo\fighters.txt将生成一个包含而不是仅包含的存档fighters.txt

因此,答案是进入要处理的目录,并使存档出现在上一个(根)目录中,然后返回该目录以处理下一个文件夹。

让7ZIP忽略根目录中现有的ZIP和CMD文件也很重要,以防止它们最终出现在归档文件中,因此请使用-x!*.zipand -x!*.cmd排除参数。

该脚本还将维护递归文件夹结构。

@echo off

REM Ensures variables set within the batch file are local to
REM this script only and will be removed when finished.
setlocal

if exist *.zip goto zip_exist

for /d %%X in (*) do (
    cls
    cd /D %%X
    "e:\Program Files\7-Zip\7z.exe" a -r  -x!*.zip -x!*.cmd "..\%%X.zip" "*.*"
    cd ..
)
goto end

:zip_exist
Echo.
Echo Note: for this script to work, compression of
Echo pre-existing zip files is not possible.

:end
pause

上面的代码应复制到批处理文件中,例如“ compress_dirs.cmd”,并从包含您要压缩的文件夹的目录中以admin身份运行。

希望这可以帮助。


0

如果您需要保留文件夹结构,并将每个文件保存在自己的结构中,请尝试以下操作:

将此命令保存在扩展名为.bat的文件中,并将其放入您需要压缩的文件夹中:

FOR /R %%i IN (*.*) DO "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" "%%i" -sdel

注意:

-sdel:删除原始文件(可选,如果只想保留压缩文件)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.