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

Gru*_*ear 40 zip total-commander archiving 7-zip packer

这是 Total Commander 的内部压缩包:

Total Commander zip packer 对话框的图片。

但是我想使用我的 7zip 打包程序。当我选择 5 个文件时,我会为每个选定的文件获得 5 个单独的 .zip 档案。我如何在 7zip 中做到这一点?

Goy*_*uix 69

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

FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"
Run Code Online (Sandbox Code Playgroud)

您需要先将目录(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"
Run Code Online (Sandbox Code Playgroud)

这是因为一些看起来像魔术的东西:

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

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

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
Run Code Online (Sandbox Code Playgroud)

  • “(*.*)”实际上是一个对试图理解你的脚本代码感到困惑的用户留下的印象深刻的面孔。 (2认同)

jft*_*uga 19

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

dir | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }
Run Code Online (Sandbox Code Playgroud)

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

Power Shell 的一个好处是您可以使用对象而不是字符串。因此,如果您愿意,您可以非常具体。例如:

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

这将只包括以下文件:

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

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

  • 7-zip 也可以创建 zip 文件 - 查看 -t 标志。示例:`7z a -tzip archive.zip *.exe` (5认同)