MS-DOSのバッチファイルに、WSH(JScript)のコードを記述する

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で作成してみました。

Google サイト内検索

Amazonアソシエイト