複数圧縮形式、複数圧縮ファイルをまとめて7z形式などに変換

昔のLZH形式の圧縮ファイルをすべてZIPファイルに変換しておきたい、HDD容量を確保するためにLZHやZIP、RARや7zなどのファイルをまとめて7z形式の超圧縮で保存しておきたいというときなどには、7-Zipのコマンドが役に立ちます。バッチファイルで再帰的にファイルを検索しながら実行することで、一括再圧縮が可能になります。

対象の圧縮ファイルを確認する

バッチファイルで対象ファイルを抽出するにはforコマンドを使うのが簡単です。メモ帳などのテキストエディタで次のようなスクリプトを記述し、~.batというファイル名で保存します。

@echo off 
for /R %%i in (*) do  (
  if /I "%%~xi"==".zip" call :再圧縮 %%i
  if /I "%%~xi"==".lzh" call :再圧縮 %%i
  if /I "%%~xi"==".rar" call :再圧縮 %%i
)

PAUSE
goto :EOF

:再圧縮
echo %1
goto :EOF

このバッチファイルを実行すると以下のような表示になります。

>for.bat 
C:\downloads\a-lzh\data.lzh
C:\downloads\b-zip\data.zip
C:\downloads\b-zip\b-sub\data.zip
続行するには何かキーを押してください . . .

表示されるファイルは、バッチファイルを置いた、もしくは実行したフォルダを起点に、それ以下の階層のファイルすべてが対象です。

このBATファイルを簡単に説明すると、まず、「@echo off」で表示されるメッセージを最小限にしています。次にバッチファイルを実行したフォルダ以下にあるファイル一覧を1つずつ取得してループを実行しています。バッチファイルでforコマンドで用いる場合、その変数は「%%」のように記述する必要があるので「%%i」としています。

見つかったファイルごと、拡張子がzipもしくはlzh、rarのファイルだったら、「:再圧縮」ラベルのルーチンをcallで呼び出します。「%%~xi」というのは「%%i」の拡張子部分の文字列という意味です。フルパスのファイル名%%iはcallの引数として渡し、「:再圧縮」ルーチンでは%1で受け取れます。それをechoコマンドで表示しているだけです。そして「goto :EOF」でサブルーチンから元のメインルーチンに戻ります。メインルーチンではすべてのファイルの評価が終わると、最後にPAUSEコマンドでいったん停止して、表示を確認できるようにしています。

一括再圧縮を実行する

対象ファイルの選定ができたところで、再圧縮のルーチンで再圧縮処理を追加します。再圧縮の手順は、単純に各ファイルにおいて一度解凍してから圧縮するだけです。基本的には上記の「:再圧縮」ルーチンに展開コマンドと圧縮コマンドを記述すれば完成です。

@echo off
set exe="C:\Program Files\7-Zip\7z.exe"

for /R %%i in (*) do  (
rem  if /I "%%~xi"==".7z" call :再圧縮 %%i
  if /I "%%~xi"==".zip" call :再圧縮 %%i
  if /I "%%~xi"==".rar" call :再圧縮 %%i
  if /I "%%~xi"==".lzh" call :再圧縮 %%i
)

cd %~p0
goto :EOF

:再圧縮
echo %1
cd %~p1
%exe% x -o$$temp$$ %1 >> NUL
cd $$temp$$
%exe% a -t7z -mx=9 -m0=lzma2 %~p1%~n1.7z * >> NUL
cd ..
rmdir /S /Q $$temp$$
if exist %~p1%~n1.7z if not "%~x1"==".7z" del /F /Q %1

goto :EOF

まず、冒頭のexe変数に7z.exeコマンドをフルパスをセットしておきます。

サブルーチンでは、処理しているファイルをechoで表示し、cdコマンドで対象ファイルのあるフォルダに作業ディレクトリを移動します。次に、$$temp$$フォルダに(-o)解凍します(x)。「 >> NUL」は7z.exeコマンドが出力する作業中のメッセージをすべて捨てるという意味です。

続いて圧縮処理です。cdコマンドで$$temp$$に作業ディレクトリを移動し、そのフォルダに展開されたファイルすべてを圧縮しています。圧縮ファイルのファイル名は、「%~p1%~n1.7z」によって拡張子を7zに変更しています。%~p1が%1のフォルダ部分、%~n1が拡張子を除くファイル名部分です。処理が終わったら、最後に作業フォルダ$$temp$$を削除し、元のファイルも削除しています。元のファイルを削除する際は、念のため、圧縮ファイルが存在しているかだけ調べて、7zから7zへの再圧縮の場合も想定して削除コマンドを実行するようにしています。

圧縮時のオプションは、「-t7z」で書庫形式を7zに、「-mx=9」で最大圧縮(超圧縮)、「-m0=lzma2」で最優先(0)の圧縮方式はLZMA2という意味になります。

なお上記のバッチファイルや改変したバッチファイルを利用する場合は、適当なフォルダ内で仮想のディレクトリ構造を作ってテストするなど、十分に確認してから実行してください。とくに元ファイルを削除する部分で記述ミスなどあるとファイルを単純に削除してしまうことになってしまいます。delコマンドで削除したファイルはごみ箱には入りません。


OSDN Project