WSHスクリプトのBATスクリプトへの組み込み(前編)

バッチスクリプトの中で、どうしてもバッチスクリプトの機能で実現できない部分だけを他のプログラムで補わないといけないことがある。既存プログラムなら、for /f の機能で処理結果を標準出力から受け取ればいいのだが、1コマンドで書けないスクリプトの場合は困る。

簡単な方法は一時ファイルを使う方法だ。例えば、何らかの処理をしてその標準出力を OUT にセットする場合、

@echo off
findstr /e "'VBS" "%~f0" > tmp.vbs
for /f "delims=" %%A in ('cscript //nologo tmp.vbs') do set OUT=%%A
del tmp.vbs
何らかのバッチスクリプト
goto :eof

VBScript をここに書く  'VBS
。。。。。         'VBS
VBScript の最終行    'VBS

のように、目印となるコメントをつけた VBSript 部だけを別ファイルに書き出してそれを呼び出せばいい。

でも、何か一時ファイルを作ると言うのはあまり気分の良いものではない。無理ならしょうがないが避けられるなら避けたいものだ。他の言語の場合は1ファイルに両方のスクリプトを書いてどちらの言語で実行してもOKということも出来る。例えば、ruby の場合、

@echo off
for /f "delims=" %%A in ('ruby -x "%~f0"') do set OUT=%%A
何らかのバッチスクリプト
goto :EOF
#! ruby
ruby スクリプトをここに書く
。。。。。
ruby スクリプトの終わり

という風に、このような使い方を想定した -x オプション(#! ruby 行まで読み飛ばす)が存在する。

bash の場合だと、

: "
@echo off
goto bat
"
bash スクリプトをここに書く
。。。。。
bash スクリプトの終わり
exit 0
:bat
for /f "delims=" %%A in ('bash "%~f0"') do set OUT=%%A
何らかのバッチスクリプト

のように、bash の : コマンドと、バッチスクリプトのラベル定義行が同形式なことを使えば出来る。@echo offgoto" " で囲んで : コマンドの一引数としてしまう。

このようなことが、VBScirpt または JScript で出来ないかどうかを考えてみる。

つづく