所有文件夹中的 7-Zip 文件(多个档案)
Posted
技术标签:
【中文标题】所有文件夹中的 7-Zip 文件(多个档案)【英文标题】:7-Zip files in all folders (multiple archives) 【发布时间】:2015-02-20 09:43:21 【问题描述】:如何让 7-Zip 递归地归档一个文件夹中所有父文件夹的所有文件?
目前我有这个:
for /d %%X in (C:\Users\mikejoh\Desktop\Modst\Ziptest\*) do "c:\Program Files\7-Zip\7z.exe" a "%%X\*.7z" "%%X\win\*"
但这只需要父文件夹并将它们压缩到同一位置...
我相信我可以在末尾添加 DEL "%%X%
之类的内容以使其删除文件。但是,在这种情况下,它会删除整个文件夹:(
示例:我在下面有这些文件夹:
这些文件夹包含这些文件夹:
我需要压缩Win
文件夹中的所有文件:
因此,对于每个文件夹,它都应该在 Win
文件夹中创建一个存档,所有文件都在 win 文件夹中。
如果一切顺利,它应该删除存档的文件。
这样的东西可以在 BAT 文件中创建吗?
【问题讨论】:
@Mofi 我知道我可以让它进入子目录,对于“ME”来说,最难的部分是让它像一个“For”循环,所以它会遍历所有这些文件夹并且只压缩内容Win 文件夹,同时将内容存档在同一位置。这就是我正在努力解决的问题,你说这可以在 WinRAR 中完成吗?你介意详细说明一下吗? 【参考方案1】:假设您桌面上的文件夹Modst\ZipTest
包含以下文件夹和文件:
结果应该是以下文件和文件夹列表,其中所有丢失的文件在 Win
子文件夹中添加到同一子文件夹中的 *.zip 文件中。
然后这可以通过使用 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%\7-Zip\7z.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.exe
或 7z.exe
的路径在您的计算机上可能不同,在这种情况下必须在批处理代码中进行调整。
【讨论】:
解释得很好,“WinRAR 只删除成功添加到存档中的文件”,这在处理可能导致系统崩溃的大量数据时非常重要。您的解决方案就像一个魅力,您能解释一下这个 ""%%~A\Win\%%~nA.zip"" 是如何工作的吗?我看到 %%A 是加载到变量中的路径位置,但是“~”和“n”在这里扮演什么角色? 在命令提示符窗口中运行for /?
并得到解释 %%~A
(循环变量 A 的字符串,不带双引号)和 %%~nA
(只是文件/目录的名称,没有路径和扩展名) 在控制台窗口页面中此命令输出的帮助下。运行带有参数/?
的命令或应用程序通常会在 Windows 上输出此命令/应用程序的帮助。以上是关于所有文件夹中的 7-Zip 文件(多个档案)的主要内容,如果未能解决你的问题,请参考以下文章