我有一个目录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
相同。
打开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.exe
和if not errorlevel 1
上以查看在不真正执行的情况下将执行的操作,这是一个好主意。
为了了解所使用的命令及其用法,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
call /?
del /?
dir /?
echo /?
for /?
if /?
set /?
阅读有关Using command redirection operators的Microsoft文章,以获取2>nul
的解释。重定向操作符>
必须在FOR命令行上使用脱字符号^
进行转义,以便在执行嵌入的[ dir
命令行是在后台以%ComSpec% /c
开头的单独命令过程中的命令行,并且在'
之间的命令行附加了附加参数。