Lhaplusでバッチを使って日付フォルダを圧縮してみました。

2018/10/01

できるだけ見てわかり変更も簡単に。NASなどネットワークにつながっているフォルダのものでも使えるようにしました。

電話の録音WAVファイルを毎晩、ひな形にしている1日ごとに分けたフォルダに移動しています。ご存知のとおり生の音声ファイルはとてもかさばりますので、ある程度以前のものは圧縮して保管したいと思います。

録音ファイルをこんな形に保存しているので、これを圧縮したいんです。

ファイルサイズと圧縮率

先に手動で1か月分のファイルをLhaplusでZip化したところ、全体で7GBあったファイルが約20%減で圧縮されました。ただし、2割引きということはできたZIPファイルは5.6GB。

見逃しがちなのが、32ビット環境では2GBを超えるサイズのファイルが正常に扱えません。案の定一応圧縮はできたものの中身が正常にみられなかったり、エラーを吐いたりします。

そのため、1~5日、6~10日というようにある程度の日付事に圧縮することにしました。すぐ想像できるでしょうが、これを手動でやろうと思うとかなり面倒。大切な音声データなのでミスを防ぎ、人の時間はチェックに充てるべきです。

そこでバッチファイルをつくって自動化

そこで自動化するわけです。lhaplusではできるファイルのサイズ指定や分割は行えないようなので、環境に応じてまとめる日付を簡単に変更できるのが望ましいでしょう。

本当はバッチ処理するなら7-zipやExplzhを使うほうがよいという解説を見かけましたが、今回は自由にソフトをいれられない環境の制限があったのでもともと入っていたLhaplusを使いました。ダウンロードは窓の杜から行えます。https://forest.watch.impress.co.jp/library/software/lhaplus/

普通にインストールすると、64bitのOSの場合は下記の場所にインストールされます。
C:\Program Files (x86)\Lhaplus\Lhaplus.exe
(x86)となっているのは、このソフトは32bit用って意味です。もともと32bitのOSの場合は、
C:\Program Files\Lhaplus\Lhaplus.exe
となります。

このフォルダにはpathが通っていないので、バッチファイルの中では直接指定します。Program Filesフォルダには半角スペースが入っていてこのままでは呼び出せないので、"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" のようにダブルクオーテーションで囲ってやります。32bitのOSを使っている場合は、(x86)の部分をとりのぞいて、"C:\Program Files\Lhaplus\Lhaplus.exe" と読み替えてください。

というわけで、とりあえず1日から5日までのフォルダを一つのZIPにまとめるには下記のようになります。

@echo off
echo 1日~5日をZIPで圧縮しています。 
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./1日 ./2日 ./3日 ./4日 ./5日
echo 6日~10日をZIPで圧縮しています。    
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./6日 ./7日 ./8日 ./9日 ./10日
echo 11日~15日をZIPで圧縮しています。   
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./11日 ./12日 ./13日 ./14日 ./15日
echo 16日~20日をZIPで圧縮しています。   
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./16日 ./17日 ./18日 ./19日 ./20日
echo 21日~25日をZIPで圧縮しています。   
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./21日 ./22日 ./23日 ./24日 ./25日
echo 26日~31日をZIPで圧縮しています。   
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./26日 ./27日 ./28日 ./29日 ./30日 ./31日

とりあえず簡単に圧縮だけ。上記をコピペしたテキストファイルの拡張子を.batに変えて、圧縮したいフォルダ群がある場所において、ダブルクリックすると、圧縮が始まります。大きいファイルは不安になるので、コマンドプロンプトに圧縮中のフォルダが表示されるようにechoを足しています。

ポイントは圧縮するフォルダの前に./をつけているところ。lhaplusの仕様だと思いますが、これがないとエラーとなります。

/c:zip はZIPファイルにするという指定。/o:. は同じ場所に圧縮ファイルを書き出すという指定です。

ネットワークにあるフォルダの場合はネットワークドライブ化

こういうフォルダがNASなどネットワーク上にある場合も多いと思います。
たとえば、IPアドレスが10.4.8.92のファイルサーバなりNAS上にあるフォルダで、同様にバッチファイルを実行してみると、「UNCパスはサポートされません」とというメッセージが表示されて残念ながらうまくいきません。

そこで、先ほどのフォルダ(ディレクトリ)をネットワークドライブ化して試してみます。

親ディレクトリを右クリックして「ネットワークドライブの割り当て」を選択します。とりあえずテストなのでAドライブにこのIPアドレス上にあるフォルダを指定してみます。

すると、表示がこんな感じに変わります。

これでAドライブになりました。この状態でバッチファイルを実行してみましょう。先ほどのPCのHDDで実行としたときと同じように圧縮が成功します。

ネットワークドライブ化もバッチファイルに組み込む

せっかくバッチファイルで自動化しているのに、手動でネットワークドライブを指定するのも残念なので、ここも自動化します。batファイルが置いてある場所をDRIVEという変数に入れて、最後の¥文字を取り除き、その場所をネットワークドライブとして指定しています。¥マークが最後に入っているとnet useが使えないからです。最初にnet use に/deleteオプションがついているのは、前につかったドライブが残っていた場合に備えての解放です。

@echo off
net use a: /delete /yes

set DRIVE=%~dp0

echo Aドライブに割り当て
net use a: %DRIVE:~0,-1%
cd /d a:

echo 1日~5日をZIPで圧縮しています。 
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./1日 ./2日 ./3日 ./4日 ./5日
echo 6日~10日をZIPで圧縮しています。    
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./6日 ./7日 ./8日 ./9日 ./10日
echo 11日~15日をZIPで圧縮しています。   
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./11日 ./12日 ./13日 ./14日 ./15日
echo 16日~20日をZIPで圧縮しています。   
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./16日 ./17日 ./18日 ./19日 ./20日
echo 21日~25日をZIPで圧縮しています。   
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./21日 ./22日 ./23日 ./24日 ./25日
echo 26日~31日をZIPで圧縮しています。   
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /o:. ./26日 ./27日 ./28日 ./29日 ./30日 ./31日

echo Aドライブを開放
net use a: /delete /yes

とりあえず、今日はここまで。日付だけでなく、フォルダ名が決め打ちなら応用が利くとおもいますので、いろいろ試してみてください。

元フォルダの削除も組み込みたいので、そこはまた次回。