バッチスクリプトの中で、どうしてもバッチスクリプトの機能で実現できない部分だけを他のプログラムで補わないといけないことがある。既存プログラムなら、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 off と goto は " " で囲んで : コマンドの一引数としてしまう。
このようなことが、VBScirpt または JScript で出来ないかどうかを考えてみる。
つづく