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

时间:2020-02-12 17:25:58

标签: windows file batch-file 7zip

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

我想从批处理文件中找到7-zip文件并将其提取到其保存目录中,然后删除这些7-zip文件。

@If "%1"=="" (Set pathf=c:\7zip\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相同。

1 个答案:

答案 0 :(得分:1)

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

@echo off
if "%~1" == "" (set "pathf=c:\7zip\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在提取档案文件时没有用。归档文件的标头中包含用于压缩的算法,因此只要使用的7z.exe支持归档文件类型和创建归档文件时使用的算法,提取就始终有效。

仅当提取成功后才删除存档文件,即7x.exe退出时的值不大于或等于1,这意味着等于0是成功的退出代码提取。

使用以下代码更为安全,如果归档文件包含在另一个归档文件中,则以下代码也可以使用。建议在FAT16,FAT32或exFAT驱动器上使用此代码。

@echo off
if "%~1" == "" (set "pathf=c:\7zip\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"
)

此代码确保不会偶然提取存档文件中的存档文件,这可能是由第一个代码对存档文件列表进行迭代而导致的,在提取包含存档文件的存档文件时每次迭代都会更改列表文件,并且由于删除了成功提取的档案。

最好先在命令提示符窗口中运行已使用的批处理文件,并在echo7z.exe的左边分别放置if not errorlevel 1,以查看将要执行的操作没有真正执行它。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

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

阅读有关Using command redirection operators的Microsoft文章,以获取2>nul的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符>必须在 FOR 命令行上使用脱字符号^进行转义,才能被解释为文字字符。 FOR ,它在以dir开头的单独命令过程中执行嵌入的%ComSpec% /c命令行,并以'之间的命令行作为附加参数。