
Windows で zip ファイルを再帰的に抽出するにはどうすればよいでしょうか? 各 zip ファイルは新しいサブディレクトリに解凍し、その後 zip ファイルを削除する必要があります。
既存または作成された各ディレクトリをスキャンして、さらに既存の zip ファイルなどを探す必要があります。
問題は、巨大な zip ファイルがあり、その中には多くのディレクトリと、おそらくさらに多くの zip ファイルが含まれていることです。元の zip ファイルは、すべての zip ファイルから解放され、元のディレクトリ ツリーは保持され、各 zip ファイルは独自のディレクトリとして表されるという規則に従う必要があります。
背後にあるロジックは次のとおりです。ディレクトリ内のファイルを解凍して zip ファイルを削除する -> そのディレクトリに移動し、そこにあるすべての zip ファイルを同じ方法で解凍する -> ディレクトリの既存のサブディレクトリすべてに移動して同じ操作を行う -> これを再帰的に実行する
再帰的にプログラムされたバッチ スクリプト ファイルの大まかな提案:
unzip_folder(%%directory):
for %%file (%%directory/*.zip) do (unzip %%file | del %%file)
for /d %%directory (*) do ( call unzip_folder(%%directory) )
return
答え1
今すぐ抽出これを行います。http://www.extractnow.com/Usage.aspx#プロセスChrome や他のブラウザでは、アプリがマルウェア/スパイウェアとしてフラグ付けされる可能性があるので注意してください。著者は、これはインストーラーからのものだと主張している。そして、ポータブル版インストーラーが必要ない人向けです (ただし、Chrome ではその zip ファイルは悪意のあるファイルとして扱われます)。
答え2
これはあなたにも使えるはずです (私には使えます)。ただし、他のフォルダがある場合は、それらを再帰的に調べて、可能なものはすべて解凍されることに注意してください。私の推奨は、実行する前に、zip ファイル (およびこのバッチ ファイル) をディレクトリに単独で配置することです。
:: To actually include the path expansion character (tilde), I had to give valid numbers; see http://ss64.com/nt/rem.html for bug reference. Also, try call /? for more info.
@REM The %~n0 extracts the name sans extension to use as output folder. If you need full paths, use "%~dpn0". The -y forces overwriting by saying yes to everything. Or use -aoa to overwrite.
@REM Using `x` instead of `e` maintains dir structure (usually what we want)
:: If you want recursive, use FOR /R
@FOR /R %%a IN (*.zip) DO @(
@if [%1] EQU [/y] (
@7z x "%%a" -o"%%~dpna" -aoa
) else if [%1] EQU [/yd] (
@7z x "%%a" -o"%%~dpna" -aoa
@if errorlevel 1 (
@echo There was an error so I won't delete
) else (
REM You can also prompt with del /p
@del "%%a"
)
) else (
@echo 7z x "%%a" -o"%%~dpna" -aoa
)
)
@echo USAGE: Use /y to actually do the extraction. Use /yd to extract then delete the zip file.
答え3
echo %rant%
さて、何時間もかけて調査し、試行錯誤し、いろいろいじった結果(PowerShellも試したが、そのままでは長いファイルパスをサポートしていない)うわぁ!)... 実際にアーカイブを再帰的に抽出し、すべてを 1 つのフォルダーに入れて削除するバージョンです...
私は Pat の回答を参考にして、260 文字を超える長いファイル パスをサポートするために、多くの修正を加えました。
@echo off
setlocal enabledelayedexpansion enableextensions
set scriptDir=%~dp0
REM Clear the log files.
echo . > unzipLog.txt
echo . > unzipErrors.txt
mkdir DeleteMe >> unzipLog.txt 2>nul
REM Recurse through all common compressed archive files.
FOR /R %%a IN (*.zip,*.7z,*.rar,*.tar,*.gz) DO (
@echo: >> unzipLog.txt 2>> unzipErrors.txt
@echo: >> unzipLog.txt 2>> unzipErrors.txt
@echo: >> unzipLog.txt 2>> unzipErrors.txt
@echo: >> unzipLog.txt 2>> unzipErrors.txt
@echo: >> unzipLog.txt 2>> unzipErrors.txt
REM Prepend \\?\ to the beginning of each path to handle paths longer than 260 characters.
if [%1] EQU [/y] (
REM Extract only.
7z x "\\?\%%a" -o"%%~dpna" -aoa >> unzipLog.txt 2>> unzipErrors.txt
) else if [%1] EQU [/yd] (
REM Extract and delete.
for %%b in ("%%a") do (
set p=%%~dpb
set f=%%~nxb
)
IF !p:~-1!==\ SET p=!p:~0,-1!
echo "!p!" "!scriptDir!DeleteMe" "!f!"
echo "!p!" "!scriptDir!DeleteMe" "!f!" >> unzipLog.txt 2>> unzipErrors.txt
7z x "\\?\%%a" -o"%%~dpna" -aoa >> unzipLog.txt 2>> unzipErrors.txt
if errorlevel 1 (
echo There was an error so I won't delete >> unzipLog.txt 2>> unzipErrors.txt
) else (
robocopy "!p!" "!scriptDir!DeleteMe" "!f!" /MOVE /FP /NS /NC /NFL /NDL /NP /IS /IT /SL >> unzipLog.txt 2>> unzipErrors.txt
)
) else (
REM Just echo.
echo 7z x "\\?\%%a" -o"%%~dpna" -aoa >> unzipLog.txt 2>> unzipErrors.txt
)
)
REM Can comment this out if you just want to extract the archives to a folder and not delete them...:
REM WARNING: recommended call this manually and very carefully!!!
REM rmdir /S /Q DeleteMe
REM WARNING: recommended call this manually and very carefully!!!
echo Use /y to actually do the extraction. Use /yd to extract then delete the zip file.
echo See unzipLog.txt and unzipErrors.txt!
endlocal
答え4
Andrew の '''setx PATH "%PATH%;C:\Program Files\7-Zip"''' が何らかの理由で実行されなかったため、Pat を修正しました。
@FOR /R %%a IN (*.zip) DO @(
@if [%1] EQU [/y] (
@"C:\Program Files\7-Zip\7z.exe" x "%%a" -o"%%~dpna" -aoa
) else if [%1] EQU [/yd] (
@"C:\Program Files\7-Zip\7z.exe" x "%%a" -o"%%~dpna" -aoa
@if errorlevel 1 (
@echo There was an error so I won't delete
) else (
REM You can also prompt with del /p
@del "%%a"
)
) else (
@echo "C:\Program Files\7-Zip\7z.exe" x "%%a" -o"%%~dpna" -aoa
)
)
@echo USAGE: Use /y to actually do the extraction. Use /yd to extract then delete the zip file.
.zip ファイルがあるパスの cmd.exe で、「unzipRecursively0.bat /yd」で実行しました。