Batch file to VBScript file (13)		at 1999.Dec.04
3.10 文法拡張のあがき
 ごちゃごちゃ書いてきましたが、実はVBScriptをもっともっと使おうとすると
 ほとんど致命的とも言える問題が見えてくる。
 今回が「13」だから、つまりキリスト教徒には不幸な数字である。ということは
 さておいて(偶然です)。

 VBSって、html(というかdhtml)に貼りつけないとどうにもならないみたい。
 例えば、スクリプトコンポーネントにすると、VBSレベルでCOMが作れて、つまり
 任意のテキストファイルからクラッキングしてあくどい事が何でもできる……?
 ごほごほ。

 そーぢゃなくて。Windows の癌、レジストリを太らすようなことをしないとダメって
 のはあたしゃ生理的に受けつけないので却下として(^^;;

 (忘れている人がいると困るが、この連載はVBSをバッチの代わりに使うというのが
  主眼であって、Excelを制御しようとか、HTMLで利用しようというかいう観点は
  微塵もないのだ)

 …ではどうするか。

 仕掛けを考えた。要するにプリプロセッサである。#include "hogehoge.vbs"と
 ソースに書いておけば、実行時にhogehoge.vbsをその行に挿入して実行する。
 というもの(あたしはCな人なのです。実は)。

 こうすれば汎用サブルーチン群は使い回しができる!メンテナンスも簡単。
 って訳。

------- WSH V2.0での拡張 -------
Windows 2000だと、WSH V2.0ってのが使えて、それだと例えば:
<package>
<job id="test">
<script language="JScript">
	WScript.Echo("This is JScript"); 
</script>
</job>
</package>
というような*.wsfファイルをそのまま実行できるんで、include fileをどうするか、
という問題は解消されるみたい。この例だけだと良く分からないですが、要するにhtmlを
そのまま実行できると思えば良いような(すっげーはしょった言い方だけど)。
#要するに、<script src='./hogehoge.vbs'></script>とかでincludeできる
-------

・小細工の仕組み
 1. ソースのどこかに行頭*1から「#include "hogehoge.vbs"」と書いて共用サブルーチン
   の使用を宣言しておく(例としてfoo.vbsとする)
 2. foo.vbsを実行する時は必ずショートカットから実行するものと自分で決めておく
 3. ショートカット自体はプリプロセッサ(vbpp.vbs)を起動し、その引数としてfoo.vbs
   を与えるようにする
 4. 起動したプリプロセッサはfoo.vbsファイルにある「#include」を見つける度に指定
   のファイルを「#include」の行に挿入する。ちなみに、hogehoge.vbsはプリプロセッサ
   が存在するフォルダの下にあるlib*2というサブフォルダの中に格納されていると仮定
 5. プリプロセッサは挿入後の新foo.vbsをWindowsのテンポラリフォルダ内に生成する
   (名前はOSに決めさせるので、foo.vbsという名前にはならないけど*3)
 6. プリプロセッサは自分が作成したその.vbsを実行する
 7. 実行終了後、プリプロセッサは作成した.vbsを消去し、証拠隠滅する

*1 何故行頭なのか、は単に手抜きが理由です。妙な所に凝っても意義ないですから
*2 フォルダ名をlibにしたのは気分です。深い意味はありません。また、共用なのか
  ローカルなのかで「#include <foo.vbs>」と「#include "bar.vbs"」を区別
  する、という案も却下しました。いや、面倒なので(^^;;
*3 テンポラリフォルダに「foo.vbs」を生成させる案は却下。ランダムにOSが決める名前の
  ままにしておかないと、foo.vbsを(プリプロセッサを使用して)多重起動した時に破綻
  しますから

 プリプロセッサはvbpp.vbsという名前で作りました。結構苦労したけど(^^;;
 …この苦労もWSH V2.0を使うと上にちょっと書いたように無意味のようですが(;_;)、
 Win9xにWSH V2.0ってのは未だなようなので暫くは個人的にこの方法を使うんでしょう。

 …できたテンポラリなVBS内でエラーがあると、とってもデバッグに苦労するん
 だけど、これ以上の解決策は思いつきませんでした。

 ・プリプロセッサはこんな感じです。下の[Show full]ボタンを押してくださいね。
(押すと、意味もなくテイル・リカージョン*1をしている純JavaScript*2でPritty-Print
します。NC 4.6以降の方はCtrl-Rで再描画させると吉です。IE4以降の方、表示が遅いのは
IEだからです。そしてNCとは異なり、F5で再描画させると不幸になるかもです。IE3以下や
NN3以下はだめでした。またJavaScriptが動かない、禁止している方は御免なさい。
後、NCでは行が長くなると強制的に改行が挿入されるので、表示がおかしくなります。)

*1 テイル・リカージョンってのは、まずいプログラムの見本の一つ(^^;; lispコンパイラ
 なら勝手にこれを判定して自動的にループに書き直したりします(lisp以外のコンパイラ
 でも今時分のはやってたりして……)。
*2 …嘘ではないけど、実はこのhtmlがtextareaのNetscape拡張である、wrap=hardを指定
 してたりする(IEでも動作するが、標準のhtmlではありません)
 vbpp.vbs

   → すげー手抜きがあります。が、そこをケアするようなコーディングに意味が
     あるとは思えないので……(開き直り。かも)

 で、共通ルーチンとしてどんなサブルーチンを作ったかというと:
 ・例えば.iniの読み書きを行うものはこんな感じです
 inictrl.vbs

   → 実はセクションやバリューの削除ができません。まぁその。所詮は.iniなんて      テキストなので、メモ帳辺りで適当にメンテして欲しい。ってこと。      レジストリをここまでして使わない理由?      レジストリって、メモリに常駐するし消しても消えない「削除マークが付く      だけだ」し、余り太るとOS (NTは大丈夫らしいが)が起動しなくなる。という      『あに考えてんだ?この悲惨な仕様は!?』って代物なので、できる限り      レジストリとはお付き合いしたくないのです  ・で、実際に「#include」を使った例が下です。(プリプロセッサで処理しないと動きません)  ちなみにこれは毎日の残業時間を日々入力し、月末の残業時間が幾つになるかを予想するってものです。  #限度を越えてしまうと色々と申請書とか出さないとヤバイし(^^;;  zcal.vbs

   → まぁその。特殊といえば特殊なものですが、例ということで(^^;;      ちなみに、動かすのに苦労するかもです。本来はちゃんとInstallerまで      あるものだったのですが、ここではあくまでサンプルとして提供します。      ちょっと社内用途に特化したInstallerなのでして(^^;;
 #ん〜。こんなことまでする奴は余りいねぇだろうなぁ……
PS. 追記(at 9.Feb.2K), 良く考えたら、実行時にVBScriptの色分けをやるんぢゃ  なくて、色分けをやった奴を貼っ付けておく方が良かったよーな……(^^;A PS2.ちなみに、適当なVBScriptのソースをTextAreaにCopy&Pasteして[Show full]って  やると、それを清書してくれますよ(On-lineでやる人は余りいないと思うけど) (EOF)