=★ B2E(Bridge To Executables) Script 仕様書 =★ 2010/10/14 =★ k.inaba ( http://www.kmonos.net/ ) 1.概要 ------------------------------------------------------   Noahは、定義ファイルを追加することで他のexeのフロントエンド  となることが出来ます。つまり、「コマンドライン用の圧縮解凍ソ  フトは面倒!」と思ったら、Noahと連携させて簡単なGUIで操作が  できるようになるわけです。   定義ファイルは、Noah.exeと同じ階層のb2eフォルダに入れること  で自動で認識されます。以下ではこの定義ファイルの書き方を解説  していきます。 2.ファイル名 ------------------------------------------------  ・拡張子は b2e  ・ファイル名に対応拡張子を記述  ex) 拡張子ishとuueとuuを展開可能にするためのスクリプトなら     ish.uue.uu.b2e  ex) となります。zzを展開するためのモノなら、単に     zz.b2e  ex) ですね。圧縮しか行わない場合は出来れば、     #rar.b2e  ex) のように、頭に # を付けて下さい。(必須ではありません) 3.サンプル -------------------------------------------------------  | load:  | (name Rar.exe)  | (type rar Fast Default *Best)  |  | encode:  | (if (method 1) (cmd a -m1 -r0 (arc.rar) (list\*.*)))  | (if (method 2) (cmd a -m3 -r0 (arc.rar) (list\*.*)))  | (if (method 3) (cmd a -m5 -mm -r0 (arc.rar) (list\*.*)))  |  | sfx:  | (cmd s (arc))  | load:  | (name 777.exe)  | (type 777 777)  |  | encode:  | (if (method 1) (cmd a (arc.777) (list\*) -mg))  |  | decode:  | (cmd x (arc)) 4.構造 ------------------------------------------------------  ・load: EXE名などを書く部分  ・decode: 解凍コマンドを書く部分  ・encode: 圧縮コマンドを書く部分  ・sfx: 書庫→SFX変換コマンドを書く部分  の4セクションに分かれます。 5.load: -----------------------------------------------------  | load:  | (name EXE名)  | (type 圧縮形式名 圧縮レベル名1 圧縮レベル名2 ...)  と書きます。圧縮を行わない時は、type の文は書かなくてOK。  ※ 圧縮レベル名の頭に * を付けると、それが標準圧縮レベルになります。 6.decode: ---------------------------------------------------  | decode:  | (cmd 実行するコマンド)  コマンド中の以下の文字列については自動で置き換えられます。   (arc) … 解凍する書庫名   (dir) … 解凍先フォルダ名   (arc-.xx ln) … 書庫名から拡張子.xxを除いたもの 7.encode: ---------------------------------------------------  | encode:  | (if (method 1) (cmd 圧縮レベル1のときのコマンド))  | (if (method 2) (cmd 圧縮レベル2のときのコマンド))  | 以下同様  自動置き換えは以下の通り。   (arc.xxx) … 圧縮先書庫名(拡張子xxx)   (dir) … 圧縮したいファイルのあるフォルダ名   (arc d) … 圧縮先フォルダ名   (list) … 圧縮したいファイルのリスト   (list\*) … 圧縮したいファイルのリスト   (list\*.*) … 圧縮したいファイルのリスト { ↑フォルダ名を渡すときに使うワイルドカードが違います } { それぞれ、"dir" "dir\*" "dir\*.*" という形式を使います } { どれを使えばよいやらわからなかったら、とりあえず } { (list\*) と書いておいてください。 } 8.sfx: ------------------------------------------------------  | sfx:  | (cmd 書庫からSFXへ変換するコマンド)  自動置き換えは以下の通り。   (arc) … 元書庫名   (arc.exe) … SFX書庫名   (dir) … 作業フォルダ名 9.encode1: sfxd: --------------------------------------------   書庫化機能がない圧縮ソフトやテキストエンコーダなど、圧縮時  には一つしかファイルを受け取らないソフトがあります。このよう  なソフトに対応するときは、encode: の代わりに、encode1: と  書いておいてください。そうすればNoah側で適当にうまいこと処理  します。   書庫→SFX変換機能がなく、直接一気にSFXに圧縮するしかない  ソフトもあります。そんなときには sfx: の代わりに sfxd: を  使います。SFX圧縮時にはNoahは直接 sfxd: を使うようになります。   encode1: も sfxd: も、自動置き換えは encode: と全く同じです。 10.休憩 -------------------------------------------------------   さっぱりわからないぃ〜状態の人は、実際に完成したファイルを  眺めてみると、頭が整理されるかもしれません。   http://b2efile.tripod.co.jp/    ( yc氏のサイト。100個以上のb2eが公開されています。 )   仕様書なんてこんな固いもん見てもわかるか!状態の人は、  実際どんな手順で書いていけばよいか、を解説したサイトが  きっと役に立つことでしょう。   http://homepage3.nifty.com/scriba/manu/    ( SB氏のサイトの一角。Noah付属のものよりずっと丁寧な     マニュアルとなっています。 )  さて、ここから下は、結構内容が濃いです。知らなくても普通に  b2eを書く分には全く困らない知識ばっかりです。(^^;  それでも読んでみたい奇特な人だけどうぞ…… =★ =★ 第二部 =★ 11.英語モードでexeを実行する技 -------------------------------  日本語版WindowsのDOS窓で動かすと、なんだか ロロロロン と出てきて  格好悪かったり、最悪の場合全く動かない…というアーカイバに  出会ったことはありませんか?  これらは、"usモード" に切り替えてから実行すると上手く動く  ことが多いです。Noahでこの切り替えを行うには、最初の name で、   (name EXE名 us)  と、後ろに us を付けて下さい。これで、そのb2eに書かれた(cmd)や  (xcmd)の実行の際には、自動でusモードになるようになります。 12.統合アーカイバDLL用スクリプト -----------------------------  load: のところで (name DLL名) とすればOKですが、それだと   ・ファイル内容による書庫判定   ・書庫閲覧&部分解凍  が出来ません。致命的です。  前者を有効にするには、   check:  って一行どこかに書いてください。中身は要りません。  後者を有効にするには、decode1: セクションを書きます。  自動置き換えは decode: セクションと同じものに加え、  (list) と書くとそこに解凍ファイル名リストが入るようになります。  decode1: セクションでは、出来るだけグラフやエラーメッセージを  抑止するようなオプションをつけて cmd して下さい。  DLL名からAPI名を算出するため、大文字小文字は間違えないように。  基本的には[最初一文字大、あと小]で大丈夫ですが、UnZip は Z も  大文字に。UnGCA も要注意。  また、元々Noahに内蔵されているルーチンはb2eより優先されるため、  ただb2eファイルを追加しただけでは、例えばUnlha32.dll用の動作を  置き換えることは出来ません。noah.ini ファイルに次の形式で  隠し設定を記述することで、内蔵ルーチンを使わないようにできます。   Kill=使いたくない内蔵ルーチン    例えば Kill=LCT なら、Unlha32,Cab32,Tar32 を使用しなくなります。      L … Unlha32 Z … UnZip32 z … Zip32j      R … Unrar32 C … Cab32  T … Tar32      B … Bga32  G … UnGCA32 A … Unarj32j      a … UnaceV2 Y … Yz1   c … Cpt      7 … 7-zip32 M … MS-Compress 13.大量のb2eを入れると ---------------------------------------  バージョン情報の表示が遅くなる環境があるそうです。  そんな場合は Noah.ini ファイルに   OldAbout=1  と一行付け加えてください。 14. As a Script Language --------------------------------------   上でさんざん[自動置き換え]として (arc) とかを紹介しましたが、  気分的には全然違います。( 機能名 引数1 引数2 ... ) の形の  functionをひたすら組み合わせて書く、Lispのまがい物のような  スクリプト言語のつもり。   例 (+ 25 8)    = 33     (* 3 7)    = 21     (+ 11 (* 3 4)) = 23  こんな感じで計算もできます。+ だったら一個目の数と二個目の数を  足した結果を返す[関数]と考えられるのと同様、(arc) も、適当な  オプションをとって書庫名を返す[関数]として実装しています。 ==================================================== ◇変数処理  変数名はアルファベット一文字、a-z, A-Z の52個が使えます。   例 (let a 25)     (let b 10)     (+ %a %b)  最後の足し算の計算結果は 35 になります。  letで変数に値を代入して、%変数名、で入れた値を取り出せます。   例 (let d (arc d))     (cmd a -d%d (list\*.*))  変数には文字列も入るので、上のような使い方も可能です。 ==================================================== ◇使うときに注意が必要な文字  送りたいコマンドや圧縮レベル名などに %"() の4種類の字を  そのまま書くとバグります。  それぞれ %%, %", %(, %) というように前に % を付けて下さい。 ==================================================== ◇全functionリファレンス  ★実行制御系   (exec ...) 機能:左から順に、単純に引数を実行していく 返値:最後の引数の値   (if A B C) 機能:Aが真ならBを実行。Cがある場合,Aが偽ならCを実行 返値:実行した方の文(BかC)の値   (while A B) 機能:Aが真である間、Bを繰り返し実行 返値:無し  ★代入系   (let A B) 機能:変数Aに、Bを代入。 ※Aには、変数名から%を除いた文字が入る。 返値:Aに入った値  ★演算系   ( + A B) … A+B   ( - A B) … A−B   ( * A B) … A×B   ( / A B) … A÷B   (mod A B) … AをBで割った余り   ( = A B) … AとBが等しければ真、等しくなければ偽   ( ! A B) … AとBが等しければ偽、等しくなければ真   ( ! A)   … Aが偽なら、真なら偽   ( < A B) … A < B なら真、でなければ偽   ( > A B) … A > B なら真、でなければ偽   (between A B C) … A <= B <= C なら真、それ以外なら偽   ( + A B) … A or B (足し算は、論理和にも使えます)   ( * A B) … A and B(掛け算は、論理積にも使えます)  ★load: 系 (name A) (type A B C D ...) 上の説明通り。   (use A B C D ...)     そのb2eで、nameで指定したexe以外に利用するファイルがあるなら     このuseによって設定します。例えば      ex) (use sfx32gui.dat zcrypt23.dll)     などと書いておくと、Noahのバージョン情報に、sfx32gui.datなどが     表示されるようになります。ただし、ここに書いたからと言って     実際の圧縮解凍作業に変化はありません。  ★その他のセクションで使えるもの(単純) (dir) 基準フォルダ名を「ショートファイル名・フルパス」で返します。 decode:中は解凍先、encode:中は圧縮元 sfx:中は作業ディレクトリ をたぶん返します。 (is_folder) ドロップされたものがフォルダ一つだったら真、でなければ偽。 (is_file) ドロップされたものがファイル一つだったら真、でなければ偽。 (is_multiple) ドロップされたものが複数だったら真、でなければ偽。 (cd A) カレントディレクトリをAに設定します。 (method A) encode: encode1: sfxd: の時のみ意味があります。 単に (method) と書くと、ユーザーが指定した圧縮レベルを返します。 (method 1) などと書くと、指定したレベルが 1 かどうかの真偽を返します。 (size A) ファイルAのサイズをバイト単位で返します。   (slash A)     文字列Aの中の \ を / に置き換えた文字列を返します。     Unix系のコマンドで \ をディレクトリと認識してくれないもの向けに。   (find A)     名前がAのファイルをPATHの通ったディレクトリから探し、     見つかったらフルパス、見つからなければ偽を返します。      ex) (if (find notepad.exe) (....))     notepad.exeがある時だけ何か実行。      ex) (let s (find stubwin.sfx)) (cmd s %s (arc))     stubwin.sfxをシステムフォルダなどから探してきてsにそのフルパスを入れる。 (cmd ARG1 ARG2 ARG3 ...) (name)で指定した実行ファイルへコマンドを送ります。 上では(arc)は自動置き換え…とか書きましたが、 functionを使っているので当然の如く (cmd ##(arc)##) とかやっても ##c:\windows\install.cab## というコマンドが送られたりはしません。 つまり、スペースで離された一パラメータの場合しか置き換えは効かないわけです。 そうでない置き換えをしたいときには、(let) で一旦変数に代入してから 変数名を埋め込めばOKです。     (cmd)命令自体の値は、実行の終了コードとなります。      ex) (if (! 0 (cmd ...)) エラー処理)     xcmdについても同様。 (xcmd A ARG1 ARG2 ...) 外部コマンド呼び出し。 最初に実行ファイル名を書いて、以降のパラメータでコマンドを書きます。 (xcmd del A) とか (xcmd copy B C) など、DOSの内部コマンドの起動も可能。  ★その他のセクションで使えるもの(複雑) (input MESSAGE DEFAULT) ユーザーに文字列を入力させるときに使います。入力を促すメッセージを 第一引数に、デフォルトの入力値を第二引数に書いて下さい(省略可能)。 入力された文字列が値として返されます。 (let p (input "パスワードを入れてね")) (cmd x -p%p (arc)) とかそんな感じに利用。 (arc[+-].ext [slfnd]) 書庫名指定。Noah は内部変数として、  ・書庫のあるフォルダ名 <-- 書庫の存在するDir(解SFX) or 出力先Dir(圧)  ・書庫名(LongFileName) <-- 書庫名(解SFX) or dropした一個目のファイル名(圧)  ・書庫名(ShortFileName) <-- 書庫名(解SFX) or dropした一個目のファイル名(圧) を持っています。 まず右の[slfnd]は置いといて左の部分を解説。  (arc … 書庫名をそのままストレートに  (arc. … 書庫名から拡張子を全て除いたもの  (arc.lzh … 書庫名から拡張子を全て除いて、.lzh につけかえたもの  (arc+.lzh … 書庫名の拡張子は取らず、後ろに .lzh をくっつけたもの  (arc-.szip … szipという拡張子だったらそれをとりのぞいたもの、          # そうでなかったら、後ろに .decompressed をくっつけたもの それぞれ  ===解凍・SFX変換時の書庫名指定  ===CPShrink対策 (--;)  ===圧縮時の普通の書庫名指定  ===aaa.txt を圧縮するとき書庫名を aaa.txt.gz にしたいとき便利  ===aaa.txt.gz を解凍するとき名前を aaa.txt に戻したいとき便利 です。 次、[slfnd] の解説。1番目のパラメータにこれらの文字があると、  s … 書庫名にはShortFileNameを使う  l … 書庫名にはLongFileNameを使う  f … 書庫名はディレクトリ+名前(FullPath)で。  n … 書庫名は名前(NameOnly)で。  d … 書庫名はディレクトリ(Direcotry)で。 という指定になります。  s === 短いファイル名しか通さないアーカイバに便利。  d === 書庫名を直接指定できないで、出力先しか指定できないものに便利。 デフォルトオプション( 単に (arc) と書いたときのオプション )は、  decode: lf  encode: lf  sfx: ln 例題。書庫名が "c:\programs\あいうえお.lzh" の場合、  1) (arc d)  2) (arc-.lzh sn)  3) (arc.cab lf)  4) (arc+.txt ln) はそれぞれどうなるでしょう? (list[r|\*|\*.*] [slfn]) 圧縮時に、ファイル名リストを返します。 slfn は (arc) と同じ。デフォルトは ln。 \* 等については、ディレクトリ名を渡すときの渡し方指定になります。 例えば (listr) コマンドを使うと、ディレクトリをワイルドカードで 渡さずにNoahが自力で展開してからexeに渡せます。 例題。"c:\file\" の中の "かきくけこ.txt" "abcde.bmp" "xxx"(ディレクトリ) を渡す場合、  5) (list)  6) (list\* s)  7) (list\*.* lf)  8) (list sf) はそれぞれどうなるでしょう? (resp A) (resq A) 引数の内容を改行で区切ってテンポラリファイルに出力し、そのテンポラリ ファイルのファイル名を返します。respは、引数A内の二重引用符を消しません。 resqは、変数A内の二重引用符を消去します。 (resp@ A) とすると "@tempfilename"、(resp-o A) とすると "-otempfilename" のような返し方も可能です。 言ってしまえば、 (cmd -a -mz (arc.cab) (resp@ (listr))) という使い方を想定しています。 15.例題の答え ------------------------------------------------- 1) c:\programs\ 2) あいう~1 3) c:\programs\あいうえお.cab 4) あいうえお.lzh.txt 5) かきくけこ.txt abcde.bmp xxx 6) かきく~1.txt abcde.bmp xxx\* 7) c:\file\かきくけこ.txt c:\file\abcde.bmp c:\file\xxx\*.* 8) c:\file\かきく~1.txt c:\file\abcde.bmp c:\file\xxx =★ =★ 第三部 =★ 16.list:セクション、(scan) -----------------------------------  前述の decode1: セクションと、今から説明する list: セクションを  追加することで、外部exeを利用するタイプのb2eでも書庫内容閲覧を  行えるようになります。万能ではありません。うまく行けば儲けモノ。(^^;  list: セクションでは普通、次のfunctionを使って格納ファイル名の  リストを手に入れます。   (scan A B C D E command...)  まず command... というコマンドを実行し、その出力を解析します。  つまり、command... にはリスト表示コマンドを書くことになります。  解析オプション A,B,C,D,E は次のような意味です。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  Aで始まる行の B行後ろから Cで始まる行の直前まで D行ずつ読み、  先頭E文字飛ばしてファイル名として読み込み。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  具体例を見て行きましょう。 例1)7za.exe の出力結果 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 7-Zip (A) 2.30 Beta 10 Copyright (c) 1999-2002 Igor Pavlov 2002-01-11 Listing archive: b2e.7z Date Time Attr Size Compressed Name ------------------- ----- ------------ ------------ ------------ 2002-01-19 00:20:48 ....A 459 103732 b2e\7z.b2e 2002-01-19 11:39:38 ....A 212 0 b2e\bh.b2e 2002-01-19 00:37:34 ....A 193 0 b2e\bix.b2e 2002-01-19 12:04:52 ....A 200 0 b2e\j.b2e 2002-01-19 00:19:46 ....A 215 0 b2e\rk.b2e 2002-01-19 12:04:32 ....A 231 0 b2e\sbc.b2e 2002-01-19 00:54:16 ....A 199 0 b2e\uha.b2e 2002-01-19 12:10:44 ....A 426044 0 Noah.exe ------------------- ----- ------------ ------------ ------------ 427753 103732 8 files +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ "---"で始まる行の1行後ろから、"---"で始まる行の直前まで1行ずつ読み、 先頭53文字飛ばして、残りがファイル名となっています。従って、b2eの書き方は list: (scan "---" 1 "---" 1 53 l (arc)) となります。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 例2)imp.exe の出力結果 ++++++++++++++++++++++++++++++++++++++++++++++++++++ IMP 1.12 High-Performance Archiver. Copyright 1998-2000 Technelysium Pty Ltd. Name/Comment Size Created Modified Attr OS Unit ---------- ------------------- ------------------- ----- ----- --------- b2e\j.b2e 196 Jan 19 2002 12:22am Jan 19 2002 12:12pm A.... Win32 1 b2e\uha.b2e 199 Jan 19 2002 12:38am Jan 19 2002 12:54am A.... Win32 1 b2e\bix.b2e 195 Jan 19 2002 12:34am Jan 19 2002 12:12pm A.... Win32 1 b2e\bh.b2e 214 Jan 19 2002 12:58am Jan 19 2002 12:13pm A.... Win32 1 b2e\7z.b2e 461 Jan 18 2002 06:11pm Jan 19 2002 12:12pm A.... Win32 1 b2e\sbc.b2e 233 Jan 19 2002 11:52am Jan 19 2002 12:14pm A.... Win32 1 b2e\rk.b2e 217 Nov 26 2001 09:52am Jan 19 2002 12:13pm A.... Win32 1 b2e\imp.b2e 235 Jan 19 2002 12:21pm Jan 19 2002 12:24pm A.... Win32 1 Noah.exe 426044 Nov 25 2001 10:08pm Jan 19 2002 12:19pm A.... Win32 1 Total: 427994 bytes in 9 files Compressed size: 104730 bytes (24% of original) Newest file modified Jan 19 2002 12:24pm +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ "---"で始まる行の1行後ろから、空行の直前まで2行ずつ読み、 先頭0文字飛ばしたところがファイル名となっています。従って、b2eの書き方は list: (scan "---" 1 "" 2 0 v (arc)) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Eは「先頭E文字飛ばして」の意味と書きましたが、これでは不十分な場合があります。 ファイル名が右揃えになっていて、左端が一定ではない場合など。このようなときには、 「頭から○番目の固まり」という形で指定したくなります。 例3)sbc.exe の出力結果 ++++++++++++++++++++++++++++++++++++++++++++++++++++ トトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトト ョョ SBC v0.910 beta Copyright (c) 2000-2001 Sami J. M・inen (sjm@pp.inet.fi) ッッ UNREGISTERED VERSION! Evaluate 30 days, then please register! See the docs! トトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトト Listing archive: "b2e.SBC"... Filename Size Date Time Attr. -------- ---- ---- ---- ----- b2e/j.b2e 199 01/19/2002 00:33:16 A b2e/uha.b2e 199 01/19/2002 00:54:16 A b2e/bix.b2e 193 01/19/2002 00:37:34 A b2e/7z.b2e 459 01/19/2002 00:20:48 A b2e/rk.b2e 215 01/19/2002 00:19:46 A b2e/bh.b2e 212 01/19/2002 11:39:38 A b2e/sbc.b2e 210 01/19/2002 11:59:50 A Noah.ilk 807600 01/19/2002 00:17:50 A UNACEV2.DLL 75264 12/27/2001 02:00:00 A Noah.exe 426044 01/19/2002 00:17:52 A Archive contains 10 files, 1310595 bytes of original data. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ " --------"で始まる行の1行後ろから、空行の直前まで 1行ずつ読み、先頭から1つ目の固まりがファイル名です。というわけで list: (scan " --------" 1 "" 1 -1 l (arc)) となります。ブロック単位で指定したいときは、マイナスをつけて指定します。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ (scan A B C D E command...)    Aで始まる行の B行後ろから Cで始まる行の直前まで D行ずつ読み、    先頭E文字飛ばしてファイル名として読み込み。  特別な仕様。   Aを "" にした場合、「先頭からB行目」から読むようになります。   「""で始まる行のB行後ろから」ではなくて。   Cを "" にした場合、「空行の直前まで」になります。   「""で始まる行(どんな行にも当てはまってしまう)まで」ではなくて。 (xscan A B C D E command...)    Aで始まる行の B行後ろから Cで始まる行の直前まで D行ずつ読み、    先頭E文字飛ばしてファイル名として読み込み。    command... の一個目に、外部実行ファイルを指定します。