我有一个目录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
相同。
答案 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"
)
此代码确保不会偶然提取存档文件中的存档文件,这可能是由第一个代码对存档文件列表进行迭代而导致的,在提取包含存档文件的存档文件时每次迭代都会更改列表文件,并且由于删除了成功提取的档案。
最好先在命令提示符窗口中运行已使用的批处理文件,并在echo
和7z.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
命令行,并以'
之间的命令行作为附加参数。