WSHには、標準入力からスクリプトを受け取ることができないので DOSの処理と、WSHの処理が必要な場合は、2つのファイルが必要になります。
今回は、ちょっと変わった手で1つのファイルで実行します。
@if (1==1) /* @ECHO OFF rem ======================================================== rem = MS-DOS 処理 rem ======================================================== :DOS ECHO I'm MS-DOS! :JSCRIPT CScript //Nologo //E:JScript "%~f0" %* GOTO :EOF rem */ @end /** ======================================================== * JavaScript 処理 * ======================================================== **/ // 主処理の呼び出し WScript.quit(main(WScript.arguments.length , WScript.arguments)); // 主処理 function main( argc, argv ) { WScript.echo("I'm JScript!"); }
これを test.bat として実行すると、以下のような結果になります。
C:\>test.bat
I'm MS-DOS!
I'm JScript!
DOSの処理中に同じファイルをJScriptとして処理させています。
ポイントは先頭の「@if」から「@end」までです。 「@if」は、条件付きコンパイラというものなのですが、 この先頭が「@」なので、DOSの「@」と共存できているのです。
1行目の「/*」で、JScriptは「*/」までコメントになります。 逆にDOSの方は「GOTO :EOF」で処理終了になるので、 前半がDOS、後半がJScriptの処理を記載できます。
WSH(JScript)の起動時にDOSで受けた引数もすべて渡していますので それを元に処理することも可能です。
以下は、簡単なサンプルです。
@if (1==1) /* @ECHO OFF rem ======================================================== rem = MS-DOS 処理 rem ======================================================== rem 書式設定 SET SCRIPT=CScript //Nologo //E:JScript "%~f0" rem 処理日取得 FOR /F %%i IN ('%SCRIPT% "%%m/%%d"') DO SET TODAY=%%i rem 処理日出力 ECHO 今日は%TODAY%です。 GOTO :EOF rem */ @end /** ======================================================== * JavaScript 処理 * ======================================================== **/ // 主処理の呼び出し WScript.quit(main(WScript.arguments.length , WScript.arguments)); // 書式付日付取得処理 function getDate( fmt ) { function _zero( val, len ) { for ( var i = 0; i < len; i++ ) { val = "0" + val; } return val.substr( val.length - len, len ); } if ( ! fmt ) fmt = "%Y/%m/%d %H:%M:%S"; var now = new Date(); fmt = fmt.replace( "%Y", now.getFullYear() ); fmt = fmt.replace( "%m", _zero(now.getMonth() + 1, 2) ); fmt = fmt.replace( "%d", _zero(now.getDate() + 1, 2) ); fmt = fmt.replace( "%H", _zero(now.getHours() + 1, 2) ); fmt = fmt.replace( "%M", _zero(now.getMinutes() + 1, 2) ); fmt = fmt.replace( "%S", _zero(now.getSeconds() + 1, 2) ); return fmt; } // 主処理 function main( argc, argv ) { if ( argc > 0 ) { WScript.echo( getDate( argv(0) ) ); } else { WScript.echo( getDate() ); } }
実行結果は以下のようになります。
C:\>test.bat
今日は02/27です。
DOSでは難しい書式付の日付をJScriptで作成してみました。