从批处理文件中将 7-zip 文件提取到它们的包含目录中?

Extract 7-zip files into their containing directory from a batch file?

我有一个目录,c:zip\test,包含许多子目录,其中一些包含 7-zip 文件。

我想从批处理文件中找到 7-zip 文件并将其解压缩到它们的保存目录中,然后删除这些 7-zip 文件。

@If "%1"=="" (Set pathf=c:zip\test\) else (Set pathf=%1) 
@If "%2"=="" (Set lzma2_test=*.7z) else (Set lzma2_test=%2)

for /r "%pathf%" %%f in ("%lzma2_test%") do 7z x -y -mx1 -m0=lzma2 "%%f" -oFolderName
del "%pathf%" + subfolder name (if needed) + 7-zip file name

而不是FolderName,我应该发送一个目录名,但我不知道如何发送。 del.

也一样

打开一个command prompt,运行for /?,从第一页的顶部到最后一页的底部阅读输出帮助,特别是关于使用修饰符引用循环变量的部分像 %~dpI 一样 I 是引用驱动器和路径的循环变量。

@echo off
if "%~1" == "" (set "pathf=c:zip\test") else (set "pathf=%~1")
if "%~2" == "" (set "lzma2_test=*.7z") else (set "lzma2_test=%~2")

for /R "%pathf%" %%I in ("%lzma2_test%") do (
    7z.exe x -y -o"%%~dpI" "%%I"
    if not errorlevel 1 del "%%I"
)

压缩开关 -mx1 -m0=lzma2 对提取存​​档没有用。存档包含在 header 中用于压缩的算法,因此只要使用 7z.exe 支持存档类型和创建存档时使用的算法,提取总是有效。

存档文件只有在提取成功时才会被删除,即 7x.exe 退出时没有大于或等于 1 的值,这意味着等于 0 这是退出代码提取成功。

如果存档文件包含在另一个存档文件中,则使用以下代码会更安全。此代码也推荐用于 FAT16、FAT32 或 exFAT 驱动器。

@echo off
if "%~1" == "" (set "pathf=c:zip\test") else (set "pathf=%~1")
if "%~2" == "" (set "lzma2_test=*.7z") else (set "lzma2_test=%~2")

for /F "eol=| delims=" %%I in ('dir "%pathf%\%lzma2_test%" /A-D /B /S 2^>nul') do (
    7z.exe x -y -o"%%~dpI" "%%I"
    if not errorlevel 1 del "%%I"
)

此代码确保不会偶然在存档文件中提取存档文件,因为第一个代码可能会发生这种情况,该代码迭代存档文件列表,每次迭代时列表都会在提取包含以下内容的存档文件时发生变化一个存档文件,并且由于删除了成功提取的存档。

最好先在命令提示符 window 中 运行 测试使用过的批处理文件,echo 留给 7z.exeif not errorlevel 1 看看在没有真正执行的情况下会执行什么。

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /?
  • del /?
  • dir /?
  • echo /?
  • for /?
  • if /?
  • set /?

阅读有关 Using command redirection operators 的 Microsoft 文章,了解 2>nul 的解释。重定向运算符 > 必须在 FOR 命令行上使用脱字符 ^ 进行转义,以便在 Windows 命令解释器处理此命令时将其解释为文字字符执行命令 FOR 之前的行,它在后台启动的单独命令进程中执行嵌入式 dir 命令行 %ComSpec% /c' 之间的命令行作为附加参数附加。