バッチでLhaplusコマンドを使用してファイルを自動解凍する


業務中に大量のファイルを解凍することがあり、興味本位で調べてみたらコマンドでLhaplusを実行できると知り調べてみました。
その結果、不格好ながらもできあがったものを紹介します。

環境

Windows 10
Lhaplus 1.74 (投稿時)
コマンドプロンプト

完成品

@echo off
rem 親フォルダ以下の指定した拡張子のファイルを全て同じ場所に解凍するバッチ
setlocal enabledelayedexpansion

rem ◆変数定義◆
set COUNT_ALLFILE=0
set S_DATE=%DATE%
set S_TIME=%TIME%
set IS_EXTENSION=false

rem ■メイン■
echo "親フォルダ以下の指定した拡張子のファイルを全て同じ場所に解凍します。"
call :guidanceExtension
call :guidanceFileSave
call :guidanceStart
call :searchAndDecompress
goto :decompressEnd

rem ◆ガイダンス(拡張子)◆
:guidanceExtension
set /p RES1="解凍対象の拡張子を入力してください。...[拡張子を入力] "
if /i %RES1%==cab set IS_EXTENSION=true
if /i %RES1%==gz set IS_EXTENSION=true
if /i %RES1%==jar set IS_EXTENSION=true
if /i %RES1%==lzh set IS_EXTENSION=true
if /i %RES1%==lzs set IS_EXTENSION=true
if /i %RES1%==mim set IS_EXTENSION=true
if /i %RES1%==rar set IS_EXTENSION=true
if /i %RES1%==tar set IS_EXTENSION=true
if /i %RES1%==taz set IS_EXTENSION=true
if /i %RES1%==tbz set IS_EXTENSION=true
if /i %RES1%==tgz set IS_EXTENSION=true
if /i %RES1%==uue set IS_EXTENSION=true
if /i %RES1%==xxe set IS_EXTENSION=true
if /i %RES1%==z set IS_EXTENSION=true
if /i %RES1%==zip set IS_EXTENSION=true
if /i %RES1%==zoo set IS_EXTENSION=true
if %IS_EXTENSION%==false (
    set /p RES2="不明な拡張子です。再入力しますか?...[Y/N] "
    if /i !RES2!==Y goto :extension
    if /i !RES2!==YES goto :extension
    goto :end
)
exit /b

rem ◆ガイダンス(リスト保存)◆
:guidanceFileSave
set /p RES3="解凍ファイルリストを保存しますか?...[Y/N] "
set ARC_LIST=FALSE
if /i %RES3%==Y set ARC_LIST=TRUE
if /i %RES3%==YES set ARC_LIST=TRUE
echo;
exit /b

rem ◆ガイダンス(開始)◆
:guidanceStart
echo 対象拡張子:%RES1% ファイルリストの保存:%ARC_LIST%
set /p RES4="以上の設定で解凍を始めます。よろしいですか?...[Y/N] "
if /i %RES4%==Y exit /b
if /i %RES4%==YES exit /b
goto :END

rem ◆対象ファイル検索&解凍◆
:searchAndDecompress
echo %CD%以下を検索します。
for /r %%i in (*.%RES1%) do (
    echo リストに追加:%%i
    set /a COUNT_ALLFILE+=1
    echo %%i >> "%CD%\file_list.txt"
)
call :decompress "%CD%\file_list.txt"
exit /b

rem ◆解凍◆
:decompress
set FILELIST=%1
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /oh /l:%FILELIST%
if /i %ARC_LIST%==FALSE del %FILELIST%
exit /b

rem ◆終了処理◆
:decompressEnd
if %COUNT_ALLFILE%==0 (
    echo 対象のファイルが存在しませんでした。プログラムを終了します。
) else (
    echo %CD%以下を検索、%COUNT_ALLFILE%のファイルを解凍しました。プログラムを終了します。
)
echo 開始日時:%S_DATE% %S_TIME%
echo 終了日時:%DATE% %TIME%
pause

:end
exit

使い方

※この記事のコードを使用したことにより不都合、不利益が生じても責任は持てませんので使用する際は自己責任でお願いします。
①上記コードをbatで保存。(この時必ず、改行コードはCRLF、文字コードはSJISで保存してください。でないと上手く動作しません。)
②保存したbatファイルを解凍したいファイルがあるディレクトリで実行。
③画面の質問に応じ、拡張子、解凍ファイルリストの保存有無、開始するしないを入力すると後は実行ディレクトリ、配下のサブディレクトリ内全ての指定した拡張子のファイルをリスト化してその場に一気に解凍してくれます。(解凍の仕方は各ユーザーのLhaplusの設定により異なります。)

苦労したところ

  • Lhaplusのオプションについての詳しい情報があまりなかった。
  • 各コマンドのオプションを理解するのに時間がかかった。

おわり

解凍の仕方は各ユーザーのLhaplusの設定により異なります。

上記に関して、オプションにテンポラリモードなるものがあるようで、それを使えば設定を統一できるかもしれませんが情報がなかったので今回は実装できませんでした。とりあえずできあがってよかったです。
これとは別にファイルをマージするバッチも作成したので時間がある時に紹介したいと思います。
バッチで同じ拡張子のファイルをマージする