バッチファイルにJavaScriptを埋め込む

より正確にはコマンドスクリプトだったりJScriptだったりするけど、気にしない。
コマンドプロンプトな話題があって、その中で「バッチファイル内にJScriptを埋め込む話」なんてのがありました。

なるほど、すばらしい!
ただ残念なことに、「環境変数の値を1つ壊してしまう副作用がある」そうです。そこで、環境変数を壊さない方法を考えてみました。
結果、こんな感じになりました。
Windows XP Professional (SP2) で試しましたが、Windows 2000以降であれば動作すると思います。たぶん。

@if (@_win32==@_mac) /*
@echo off

REM "goto :EOF" を使用するため、コマンド拡張機能を有効にする
setlocal enableextensions

echo コマンドスクリプト

REM JScript の呼び出し
"%SystemRoot%\system32\cscript.exe" "%~f0" //E:JScript //Nologo

goto :EOF
 */ @end

WScript.echo('JScript');

1行目の@if (@_win32==@_mac) /*は、おそらくこう解釈するんでしょう。

  • コマンドスクリプト: もし(@_win32@_mac)が等しければ、/*コマンドを実行する。
  • JScript: (条件コンパイル)もし@_win32@_macが等しければ、続くテキストを解析する(ここでは省略しているので何もしない)。

コマンドスクリプトJScriptも偽となるので、うまいこといくみたいです。
「1週間後の日付を表示する」という例はこんな感じ。

@if (@_win32==@_mac) /*
@echo off
setlocal enableextensions

for /f "delims=" %%A in ('cscript.exe "%~f0" //E:JScript //Nologo') do set OUT=%%A
echo 1週間後の日付は %OUT:~0,4%-%OUT:~4,2%-%OUT:~6,2%

goto :EOF
 */ @end

var d = new Date((new Date).getTime() + 7 * 24 * 3600 * 1000);
WScript.echo(d.getYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate());