web-dev-qa-db-ja.com

Windows 7で7-Zipを使用して、サブフォルダー内のすべてのZipファイルを抽出するにはどうすればよいですか?

多くの Zip ファイルを含む大きなWindows7フォルダーツリー構造があります。これらは単層のZipファイルです(Zip内のZipではありません)。このフォルダ構造を解析し、ファイル拡張子で各Zipファイルを見つけ(例を参照)、同じ場所に解凍(Zipファイルを削除し、抽出したファイルを残す)するために使用できる7-Zipコマンドは何ですか?

例:フォルダーの階層内のすべてのファイルには、abc.mp3.Zipまたはxyz.jpg.Zipのような名前が付けられます。ネイティブファイル拡張子の後に「.Zip」が続きます。 7-Zipで、ワイルドカード(* .mp3.Zip、*。jpg.Zipなど)を使用してファイル拡張子でツリー内のすべてのファイルを検索し、新しいフォルダーを作成せずに現在の場所に抽出して、結果がabcになるようにします。 mp3およびxyz.jpg。

2
radian21

私の知る限り、7-Zipにはあなたが探していることを実行するコマンドがありません。これがWindowsのバッチファイルスクリプトで、あなたが望むことをするだろうと思います。処理するフォルダツリーのルートへのパスを指定できるように、コマンドラインから実行する必要があります。

ファイルunzipper.bat

@echo off
setlocal
if "%1"=="" goto Usage

call :Get7zCmd
:: Recurse folder passed in as paramater
for /r %1 %%Z in (*.Zip) do (
    echo ====
    rem Change to the directory of Zip file
    cd /d "%%~dpZ"
    rem Extract all files to current directory
    echo %_7zCmd% e "%%~nxZ" -y
    rem Delete the Zip file
    echo del "%%~nxZ"
)
goto End

:Usage
echo.
echo Parses through folder structure starting at the specified path, finding
echo and extracting the contents of all Zip files found, and then deletes
echo the Zip file.
echo.
echo Usage:
echo     %~n0 root-directory-path
echo.
echo     For example:
echo.
echo %~n0 "D:\some folder"

:End
goto :EOF

:: ==========================
:: Subroutine Get7zCmd
:: Determines the full path to 7-Zip command-line executable from the Windows
:: Registry and sets the variable "_7zCmd" to the result.
:Get7zCmd
set Reg.Key=HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe
set Reg.Val=Path
for /F "Tokens=2*" %%A in ('Reg Query "%Reg.Key%" /v "%Reg.Val%" ^| find /I "%Reg.Val%"') do call set PathDirectory=%%B
set _7zCmd="%PathDirectory%%\7z.exe"
exit /b 0

スクリプトが行うことは全体としてかなり過激であり、後で多数のファイルを抽出して多くのZipファイルを削除する可能性があるため、破壊的である可能性があるため、12行目と14行目のコマンドを無効にして、接頭辞echoを付けます。 。これにより、echoがなかった場合に何をしたかを印刷するだけになります。そうすれば、予期しない問題が発生した場合に、ファイルシステムに損傷を与えることなく、最初にスクリプトをテストできます。

スクリプトを変更して実際にこれらのアクションを実行するには、2行のそれぞれでechoを削除する必要があります。もちろん、責任の標準的な免責事項が適用されます。

2
martineau