b2eの書き方…論理編

1.基本事項

概要

Noahは、スクリプトファイルを書くことによって他のexeの フロントエンドとなることが出来ます。つまり、コマンド ライン用の圧縮解凍ソフトは面倒!と思ったら、Noahと連携 させて、NoahのGUIで圧縮解凍ができるようになるわけです。

設置場所

Noah.exe と同じ階層の b2e フォルダに入れれば認識します。

ファイル名

・拡張子は b2e。
・ファイル名に対応拡張子を記述。

例えば、拡張子 ish と uue と uu を展開可能にするための スクリプトなら、ファイル名は
ex) ish.uue.uu.b2e
となります。zz を展開するためのモノなら、単に
ex) zz.b2e
ですね。圧縮しか行わない場合は出来れば、
ex) #rar.b2e
のように、頭に # を付けて下さい。(必須ではありません)

構造

・load: EXE名などを書く部分
・decode: 解凍コマンドを書く部分
・encode: 圧縮コマンドを書く部分
・sfx: 書庫→SFX変換コマンドを書く部分

の4セクションに分かれます。以下でそれぞれの部分について解説します。
※なお、他に特殊なセクションとして encode1: sfxd: decode1: check: があります。(後述)

2.load:

■ load:
■ (name EXE名)
■ (type 圧縮形式名 圧縮レベル名1 圧縮レベル名2 ...)

と書きます。圧縮を行わない時は、type の文は書かなくてOK。
※ 圧縮レベル名の頭に * を付けると、それが標準圧縮レベルになります。

3.decode:

■ decode:
■ (cmd 実行するコマンド)

ただし、コマンド中の以下の文字列については自動で置き換えられます。

(arc) … 解凍する書庫名
(dir) … 解凍先フォルダ名
(arc-.xx ln) … 書庫名から拡張子.xxを除いたもの

4.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\*) と書いておいてください。 )

5.sfx:

■ sfx:
■ (cmd 書庫からSFXへ変換するコマンド)

自動置き換えは以下の通り。

(arc) … 元書庫名
(arc.exe) … SFX書庫名
(dir) … 作業フォルダ名

6.encode1: sfxd:

書庫化機能がない圧縮ソフトやテキストエンコーダなど、 圧縮時には一つしかファイルを受け取らないソフトがあります。 このようなソフトに対応するときは、encode: の代わりに、 encode1: と書いておいてください。そうすればNoah側で 適当にうまいこと処理します。

書庫→SFX変換機能がなく、直接一気にSFXに圧縮するしかない ソフトもあります。そんなときには sfx: の代わりに sfxd: を 使います。SFX圧縮時にはNoahは直接 sfxd: を使うようになります。

encode1: も sfxd: も、自動置き換えは encode: と全く同じです。

7.Tips

英語モードでexeを実行する技

日本語版WindowsのDOS窓で動かすと、なんだか ロロロロン と出てきて格好悪かったり、最悪の場合全く動かない…というアーカイバに 出会ったことはありませんか?
これらは、"usモード" に切り替えてから実行すると上手く動く ことが多いです。Noahでこの切り替えを行うには、最初の name で、

(name EXE名 us)

と、後ろに us を付けて下さい。これで、そのb2eに書かれた(cmd)や (xcmd)の実行の際には、自動でusモードになるようになります。

統合アーカイバDLL用スクリプト

load: のところで (name DLL名) とすればOKですが、それだと
・ファイル内容による書庫判定
・書庫閲覧&部分解凍
が出来ません。致命的です。

前者を有効にするには、
check:
って一行どこかに書いてください。中身は要りません。

後者を有効にするには、decode1: セクションを書きます。
自動置き換えは decode: セクションと同じものに加え、 (list) と書くとそこに解凍ファイル名リストが入るようになります。
decode1: セクションでは、出来るだけグラフやエラーメッセージを 抑止するようなオプションをつけて cmd して下さい。

DLL名からAPI名を算出するため、大文字小文字は間違えないように。
基本的には[最初一文字大、あと小]で大丈夫ですが、UnZip は Z も 大文字に。UnGCA も要注意。

使うときに注意が必要な文字

送りたいコマンドや圧縮レベル名などに %"() の4種類の字を そのまま書くとバグります。
それぞれ %%, %", %(, %) というように前に % を付けて下さい。

8.As Rythp

上でさんざん[自動置き換え]として (arc) とかを紹介しましたが、 気分的には全然違います。( 機能名 引数1 引数2 ... ) の形の functionをひたすら組み合わせて書く、LISPのまがい物のような スクリプト言語のつもり。

+ だったら一個目の数と二個目の数を 足した結果を返す[関数]と考えられるのと同様、(arc) も、適当な オプションをとって書庫名を返す[関数]として実装しています。

◇Rythpの変数処理

変数名はアルファベット一文字、a-z, A-Z の52個が使えます。

letで変数に値を代入して、%変数名、で入れた値を取り出せます。

例 (let d (arc d))
(cmd a -d%d (list\*.*))

変数には文字列も入るので、上のような使い方も可能です。

◇今のところある全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 なら真、それ以外なら偽

★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: の何の最中かによって基準フォルダは変わります。
decode:中は解凍先、encode:中は圧縮元、sfx:中は作業ディレクトリ をたぶん返します。

(is_folder)

ドロップされたものがフォルダ一つだったら真、でなければ偽。

(is_file)

ドロップされたものがファイル一つだったら真、でなければ偽。

(is_multiple)

ドロップされたものが複数だったら真、でなければ偽。

(cd A)

カレントディレクトリをAに設定します。

(method A)

encode: encode1: sfxd: の時のみ意味があります。
単に (method) と書くと、ユーザーが指定した圧縮レベルを返します。
(method 1) などと書くと、指定したレベルが 1 かどうかの真偽を返します。

(size A)

ファイルAのサイズをバイト単位で返します。

(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です。

(xcmd A ARG1 ARG2 ...)

外部コマンド呼び出し。
最初に実行ファイル名を書いて、以降のパラメータでコマンドを書きます。

★その他のセクションで使えるもの(複雑)

(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

(list[r|\*|\*.*] [slfn])

圧縮時に、ファイル名リストを返します。
slfn は (arc) と同じ。デフォルトは ln。
\* 等については、ディレクトリ名を渡すときの渡し方指定になります。
例えば (listr) コマンドを使うと、ディレクトリをワイルドカードで渡さずにNoahが自力で展開してからexeに渡せます。

(resp A)
(resq A)

引数の内容を改行で区切ってテンポラリファイルに出力し、そのテンポラリファイルのファイル名を返します。respは、引数A内の二重引用符を消しません。
resqは、変数A内の二重引用符を消去します。
(resp@ A) とすると "@tempfilename"、
(resp-o A) とすると "-otempfilename"
のような返し方も可能です。

言ってしまえば、
(cmd -a -mz (arc.cab) (resp@ (listr)))
という使い方を想定しています。