2005年10月20日

+Lhaca でサブホルダごとに一括圧縮

圧縮とか解凍、どのように活用してますか?

通常は、数個のファイルをまとめて圧縮したり、
ひとつのホルダにまとめて、ホルダごと圧縮したり・・・

この程度だと思います。
たぶん、私の使い方のほうが異常なんでしょうね。


私は、多少 CAD/CAM 関連に携わっているんですが、
最近、極端にデータのサイズが巨大化しているんですよ。
200MB 程度のデータはあたり前、500MB にもなるデータもあります。
CPUの高速化、搭載メモリ、ハードディスクの大容量化によって
処理速度、データサイズ的に実用に至ってなかった様々な自動作図が
可能になった為ではないかと推察していますが・・・

こんなデータを保存しておくと、すぐにハードディスクを
圧迫してきちゃうんですね。

幸い・・・っていうか、データ交換フォーマットには、
まだまだテキストベースのものが主流なので、
1〜2割程度に圧縮することができるんですよ。

だからって、1個のファイルにしてしまっては、
毎回全てを解凍、圧縮しなければならず、サイズが巨大ですから
その処理自体にかなりの時間が必要になってしまいます。

なので、関連データごとにホルダー分けして圧縮するのですが、
ホルダー数で10個程度、最高で200個くらいを
別々に圧縮することになるんです。瞬時に処理できる
ホルダも多いのですが、サイズが大きくなると、やっぱり
待ち時間が長くなるんですよね・・・

一括で指定して、ホルダーごとに圧縮してくれるツールも、
探せばあるとは思いますが、残念ながら、私は知りません。
まとめて指定すると、1個の圧縮ファイルになっちゃうんですね。


ふぅ〜〜 やっと前振りが終わりました ^^;


さあ、ここでバッチファイルの出番が来たわけです。

えっ? バッチファイルで圧縮プログラム書くのかって??

ご心配無用、そういった難しいところは
とってもありがたい方達が提供して下さっています。

私が使用している圧縮・解凍ツールは、+Lhaca です。
フリーの圧縮・解凍ソフトで、操作もドラッグ&ドロップするだけと
いたって簡単であり、PC初級者にでも充分に使いこなせるため、
現在、最もホピュラーな圧縮・解凍ソフトだと思います。

  詳細・ダウンロードは +Lhaca ホームページ へどうぞ


今回のバッチファイルも、+Lhaca を使用する前提で書いたんです。
見るからに、バッチ処理には最適なツールだからね。

なぜかと言うと、「実行中に一切の操作が必要ない」 ということと
「ドラッグ&ドロップを受け付ける」 という点だね。

「実行中に一切の操作が必要ない」 という理由は解かるよね。
必要だったら、ただ自動で次々と起動してくるだけになってしまう。
操作を催促されている状況じゃ、かえってストレスだよね。

「ドラッグ&ドロップを受け付ける」 っていうのは、
ファイル名を引数として受け取っている状態なんだよ。


あ〜〜ッ!! 引数の話をするの忘れてたような・・・^^;


とりあえず、ごく簡単に話しちゃおう。詳しくは、また後から書くね。

まず、コマンドプロンプトを開いて、cd コマンドで
どこか .txt ファイルのある場所に移動してください。そうしたら

notepad ?????.txt    ????? は、実際にあるファイル名

指定したファイルが開かれたでしょ?
ドラッグ&ドロップ しても同じ動作するよね。
このように、実行ファイル名に続く文字列を、その実行ファイルに
渡せる仕様になっているんだ。ただ、何でもいい訳じゃなくて、
アプリケーション側で指定された形式じゃないと処理できない。
その文字列を解読して実行するのはアプリ側だからね。

だから、+Lhaca の場合は、ファイル名やホルダ名なら
パスの長さが許す限り受け取って処理してくれるってことなんだよ。
(たぶん・・・ ^^;)

でも、今回やりたいのは、ひとつのホルダを指定しすることで、
その中にある全てのサブホルダを、各々に圧縮するということ。
だから、パスの長さの心配は全くない。
サブホルダをひとつずつ、+Lhaca に渡してやればいいことになる。


そしたら、バッチファイルにどのような手順を書き込めばいいのか、
考えてみよう。

1、ホルダ名を引数またはドラッグ&ドロップで受け取る。
  複数の指定を許可する。
2、複数のためのループ先頭
3、 対象の引数がホルダか否かの判断、否なら処理をスキップ
4、  指定ホルダ内のサブホルダ名一覧を作成
5、  一覧から順番に1個ずつピックアップし、+Lhaca に送る。
6、 処理のスキップ先
7、 対象の引数を次に移動。引数が無くなったら終了処理
8、ループ末尾。ループ先頭へ戻る
9、終了処理


このような流れを書き込めれば、実現できそうなのは判るでしょ。
でも、そこがどう書いたらいいのか、解からないんだよね。



お待ちどうさま。 私の使用している自作のソースを公開します。
文末の「ソースを見る」 をクリックしてください。

コマンドプロンプトを本格的に勉強し始めて、だいたい、
10日くらいで初版を書き、最近、整理・修正したものです。

たいしたソースじゃありませんが、コピーおよび再利用は
いくらして頂いても構いません。ただし、使用した場合の
全てのトラブルについては、一切の責任を持てませんので、
自己責任の範囲内での使用、および処理をお願いいたします。

まあ、勉強用には、いくらでもコピーしてくださいってことです。



後になって自分でも解からなくなり兼ねないので、
必要以上にコメントが書いてありますので、
実際にソースを見たほうが解かり易いかもね。


ひとまずは、いろいろ遊んでみてください。

その前に、2点ほど注意しておきます。

環境変数の扱いにはくれぐれも注意してくださいね。
場合によっては、PC自体の動作に影響してきます。

それから、削除系のコマンド・・・
ワイルドカードを使うと確認メッセージが出ますが、
バッチ処理では邪魔になるものです。
表示を回避するオプションも用意されていますが、
これは充分に確認した後、最後に付けるようにしましょうね。


それでは、充分に楽しんでみてくださいね〜。


@echo off
 
rem ------------------------------------------------------
rem
rem ホルダーを引数として受け取る(ドラッグ&ドロップ対応)
rem
rem 引数で与えられたホルダー内にあるサブホルダーを、再帰的に
rem +Lhaca に送り、サブホルダー毎の圧縮ファイルを作成する。
rem
rem 出力先は +Lhaca の設定によるが、「ファイルと同じ場所」が
rem 圧縮先に設定されていた場合、引数で与えられたホルダーと
rem 同じ場所に出力される。
rem
rem 圧縮処理をしたくない、または必要のない場合、ホルダー名
rem の先頭文字を _ (アンダースコア) にすればスキップされる
rem
rem +Lhaca の実行ファイルへのパスは、使用するマシンに
rem あわせて適切に設定する必要がある。
rem
rem 安全のため、圧縮済みホルダーの削除は行わない。
rem 必要があれば、各自手作業で削除すること!
rem
rem                                   2005/08/09 I.Kawaguchi
rem     ドラッグ&ドロップ対応・整理  2005/10/07 I.Kawaguchi
rem -------------------------------------------------------
 
rem 必ず引数を受け取る (ドラッグ&ドロップ対応)
 
rem 環境変数として、+Lhaca のパスと一時ファイル名を定義
 
    set LHACA_PATH="D:\Program Files\Lhaca\Lhaca.exe"
    set TEMP_FILE=dircomp.$$$
    set LOG_FILE_NAME=%~dp0SubDirLhaca.log
 
    echo %DATE% %TIME%                     > %LOG_FILE_NAME%
    echo.                                 >> %LOG_FILE_NAME%
    echo Lhaca Path = %LHACA_PATH%        >> %LOG_FILE_NAME%
    echo Temp File = %TEMP_FILE%          >> %LOG_FILE_NAME%
    echo.                                 >> %LOG_FILE_NAME%
 
:loop
 
    echo %TIME% Input Param = %1  >> %LOG_FILE_NAME%
 
rem 引数がホルダか否かを判別する
 
    set IS_DIRECTORY=NULL
 
    for /f "usebackq delims==" %%i in (
        `dir /a:d /b %1\..`
    ) do (
       if %%i==%~nx1 set IS_DIRECTORY=%%i
    )
 
rem ホルダーでなければ処理しない
 
    if %IS_DIRECTORY%==NULL (
        echo   Not Directory...!!         >> %LOG_FILE_NAME%
        goto jump
    )
 
rem カレントディレクトリを %1 に移す
 
    cd /d %1
 
rem ディレクトリ名だけを一時ファイルに書き出す
 
    dir /a:d /b > %TEMP_FILE%
 
rem 空白のデリミタをキャンセル、
rem 先頭のアンダースコアをコメントとして
rem 一時ファイルから変数に読込み +Lhaca に送る
 
    for /f "eol=_ delims=" %%i in (%TEMP_FILE%) do (
        echo   Running...  %%i            >> %LOG_FILE_NAME%
        %LHACA_PATH% ".\%%i"
 
        rem 処理済サブホルダーの削除
        rem if exist "%%~ni.lzh" (
        rem    echo Delete Directory  %%i >> %LOG_FILE_NAME%
        rem    rmdir /s /q ".\%%i"
        rem )
    )
 
rem 一時ファイルの削除
 
    if exist %TEMP_FILE% del %TEMP_FILE%
 
:jump
 
    echo.                                 >> %LOG_FILE_NAME%
 
    shift
    if "%1"=="" goto end
 
    goto loop
 
:end
 
    echo %TIME%  Complete!!               >> %LOG_FILE_NAME%
 
    set IS_DIRECTORY=
    set LHACA_PATH=
    set TEMP_FILE=
    set LOG_FILE_NAME=
 
    exit 0
 

応援ポチ  お願いしま〜す。

posted by Woody at 02:56 | 静岡 ☁ | Comment(1) | TrackBack(0) | コマンドプロンプト
この記事へのコメント
お世話になります。

echo Running... %%i >> %LOG_FILE_NAME%
上記にて、フォルダーが凍結されたと思いますが、凍結されたファイルは何処に存在しますか?

注)c:\WK1の中にTRS_DATAなるホルダーがあり、その中にデーターファイルがあります。

先の質問は解決し、これは新規質問です。
Posted by 重松宏昌 at 2007年06月13日 13:13
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。