バッチファイルに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());