将7压缩文件从批处理文件提取到其包含的目录中?

问题描述 投票:0回答:1

我有一个目录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相同。

windows file batch-file 7zip
1个回答
0
投票

打开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"
)

此代码确保不会偶然提取存档文件中的存档文件,这是因为第一个代码会迭代存档文件列表,并且每次提取包含存档文件的存档文件时每次迭代都会更改列表,以及由于删除了成功提取的档案。

首先通过在命令提示符窗口中运行已使用的批处理文件(将echo留在7z.exeif not errorlevel 1上以查看在不真正执行的情况下将执行的操作,这是一个好主意。

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

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

阅读有关Using command redirection operators的Microsoft文章,以获取2>nul的解释。重定向操作符>必须在FOR命令行上使用脱字符号^进行转义,以便在执行嵌入的[ dir命令行是在后台以%ComSpec% /c开头的单独命令过程中的命令行,并且在'之间的命令行附加了附加参数。

© www.soinside.com 2019 - 2024. All rights reserved.