所有文件夹中的 7-Zip 文件(多个存档)

7-Zip files in all folders (multiple archives)

如何使 7-Zip 递归归档所有父文件夹的文件夹中的所有文件?

目前我有这个:

for /d %%X in (C:\Users\mikejoh\Desktop\Modst\Ziptest\*) do "c:\Program Files-Zipz.exe" a "%%X\*.7z" "%%X\win\*"

但这只会获取父文件夹并将它们压缩到同一位置...

我相信我可以在末尾添加类似 DEL "%%X% 的内容以使其删除文件。但是,在这种情况下,它会删除整个文件夹:(

示例:我在下面有这些文件夹:

这些文件夹包含这些文件夹:

我需要将所有文件压缩到 Win 文件夹中的位置:

因此,对于每个文件夹,它应该在 Win 文件夹中创建一个存档,所有文件都在 win 文件夹中。 如果一切顺利,它应该删除归档文件。

是否可以在 BAT 文件中创建类似的内容?

假设您桌面上的文件夹 Modst\ZipTest 包含以下文件夹和文件:

  • 测试1
      • File1.txt
      • File2.txt
      • File3.txt
    • xxx.txt
  • 测试2
      • File1.txt
      • File2.txt
      • File3.txt
    • yyy.txt
  • 测试3
      • File1.txt
      • File2.txt
      • File3.txt
    • zzz.txt

结果应该是下面的文件和文件夹列表,其中 Win 子文件夹中的所有缺失文件已添加到同一子文件夹中的 *.zip 文件中。

  • 测试1
      • Test1.zip
    • xxx.txt
  • 测试2
      • Test2.zip
    • yyy.txt
  • 测试3
      • Test3.zip
    • zzz.txt

然后这可以通过使用WinRAR的批处理代码来实现:

@echo off
for /D %%A in ("%USERPROFILE%\Desktop\Modst\ZipTest\*") do (
   "%ProgramFiles%\WinRAR\WinRAR.exe" m -afzip -cfg- -ed -ep -ibck -inul -m5 -tl -u -y "%%~A\Win\%%~nA.zip" "%%~A\Win\*"
)

优点是 WinRAR 只删除成功添加到压缩包中的文件。当 WinRAR 想要读取文件内容进行压缩时,所有被锁定的文件都保留在文件夹中。不知道当要压缩和删除的文件当前被另一个应用程序写入文件夹中时,是否会执行此批处理文件。

7-Zip 解决方案需要在批处理文件中添加更多命令:

@echo off
for /D %%A in ("%USERPROFILE%\Desktop\Modst\ZipTest\*") do (
    "%ProgramFiles%-Zipz.exe" u -tzip -mx=9 -y "%%~A\%%~nA_tmp.zip" "%%~A\Win\*">nul
    if not errorlevel 1 (
        del /F /Q "%%~A\Win\*"
        move "%%~A\%%~nA_tmp.zip" "%%~A\Win\%%~nA.zip"
    ) else (
        if exist "%%~A\%%~nA_tmp.zip" del "%%~A\%%~nA_tmp.zip"
    )
)

没有测试每个文件在删除之前是否真的添加到存档中。如果在压缩 Win 子文件夹中的任何文件期间发生任何错误,则不会删除任何文件,但父文件夹中的 ZIP 文件除外(如果根本没有创建 ZIP 文件)。

注意: WinRAR.exe7z.exe 的路径在您的计算机上可能不同,在这种情况下必须在批处理代码中进行调整。