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

前回の続き。
VBScrirpt と異なり、JScript には、行末までのコメント記号 // の他に、 /* */ で囲んだ複数行コメントが書ける。従って、バッチスクリプト部分をこれで囲めばコンパイル対象外に出来るため VBScript のようなコンパイルエラーを回避できる。
後は、/* がバッチスクリプトとしてもエラーにならなく書け、それが JScript としてもエラーにならない書き方が出来ればいい。共通のコマンド/ステートメントとして、@set 文が使えそうである。JScript@set でセットできる変数名は @ で始まり、値は真偽か数字と制約がある。一方、バッチスクリプトset コマンドとして見ると @ のために行がエコーされないので都合が良い。

今回も、一週間後の日付けを表示するという具体例でいく。

@set @_=1/*
@echo off
for /f "delims=" %%A in ('cscript //nologo //E:jscript "%~f0"') do set OUT=%%A
echo 一週間後の日付けは %OUT:~0,4%-%OUT:~4,2%-%OUT:~6,2%
goto :eof
*/
d=new Date((new Date).getTime()+7*24*3600*1000);
WScript.Echo(d.getYear()*10000+(d.getMonth()+1)*100+d.getDate());

これで一応動作する。バッチスクリプト内に */ が出現する場合はまずいが、例えば、

echo コメントの終わりは */

という文を書く必要があれば、

set STAR=*
echo コメントの終わりは %STAR%/

のように書き直せばよい。

別解として、条件コンパイルを使って、

@set @_=1//&echo off&goto bat
@cc_on
@if (false)
:bat
for /f "delims=" %%A in ('cscript //nologo //E:jscript "%~f0"') do set OUT=%%A
echo 一週間後の日付けは %OUT:~0,4%-%OUT:~4,2%-%OUT:~6,2%
goto :eof
@end
d=new Date((new Date).getTime()+7*24*3600*1000);
WScript.Echo(d.getYear()*10000+(d.getMonth()+1)*100+d.getDate());

というのもあるが、/* */ を使うのが簡単だろう。

なお、いずれの手段でも、外側のバッチ環境変数を一つ(この例では @_ )の値を破壊してしまう副作用がある。