![循环提取 zip 文件并处理嵌套的 zip 文件](https://linux22.com/image/1633551/%E5%BE%AA%E7%8E%AF%E6%8F%90%E5%8F%96%20zip%20%E6%96%87%E4%BB%B6%E5%B9%B6%E5%A4%84%E7%90%86%E5%B5%8C%E5%A5%97%E7%9A%84%20zip%20%E6%96%87%E4%BB%B6.png)
我有一个命令可以提取目录中的所有 zip 文件。问题是您可能嵌套了 zip 容器(zip 中嵌套 zip)。我希望它执行一次运行,然后进行第二次循环。如果它找到更多 zip 文件,则提取并再次循环。一旦循环找不到任何未提取的文件,它就会停止。请记住,我的 zip 提取命令不是故意删除原始 zip 文件(我理解如果我这样做可能会更容易)。希望通过批处理文件完成此操作(不要使用 powershell 等其他语言)。
for /F "DELIMS=" %%I IN ('dir /b /s *.zip *.rar *.7z') DO ( "C:\Program Files\7-Zip\7z.exe" x -aos -o"%%~dpnI%%~xI(ext)" "%%I"
我可以对其进行破解,并多次进行手动循环以尝试捕获所有嵌套的 zip,但我认为可能有更可靠的方法。
SET /a VAR=0
:HOME
SET /a VAR=VAR+1
IF %VAR%==50 goto :End
for /F "DELIMS=" %%I IN ('dir /b /s *.zip *.rar *.7z') DO ( "C:\Program Files\7-Zip\7z.exe" x -aos -o"%%~dpnI%%~xI(ext)" "%%I" >>log.txt )
goto :HOME
:END
pause
答案1
for /R
请尝试for /F
:
@echo off && setlocal EnableDelayedExpansion
rem :: check 7-zip\7z.exe in %path% variable ::
2>nul 7z.exe >nul && set "_7z=7z.exe" && goto=%:^)
rem :: check 7-zip\7z.exe x86, 64 and W6432 variable ::
for %%i in (ProgramFiles,ProgramFiles(x86^),ProgramW6432
)do if /i defined %%~i for /f tokens^=* %%z in ('2^>nul ^^^
where /r "!%%~i!\7-zip" 7z.exe')do set "_7z=%%~z" && goto=%:^)
rem :: one simple error message if 7-zip was not found
echo\7z.exe was not found in %% path %% variable and nor in...
echo\%%ProgramFiles%% ^| %%ProgramFiles(x86)%% ^| %%ProgramW6432%%
<con: rem./ && %__APPDIR__%timeout.exe -1 & endlocal & goto=%:eof
%:^)
echo\Expanding: *.rar,*.zip,*.7z && for /r %%I in (*.rar,*.zip,*.7z
)do <con: "!_7z!" x -aos -o"%%~dpnI%%~xI(ext)" "%%~I" >>"%~dp0log.txt"
<con: rem.// && %__APPDIR__%timeout.exe /t -1 & endlocal && goto=%:eof