Batファイルとして Node.js の JavaScript ファイルを動かす方法

対象

Windows
Batファイルのように Node.js のJS を動かしたい方

はじめに

Windows には WSH(Windows Scripting Host) の JScript という JavaScript があって、拡張子 .js として保存したファイルをダブルクリックで動かせて便利なのです。

が、弱点がありまして、
かなり古い JavaScript だって所です。
最近のフロントエンド開発者や、node.js 系の開発者からすると、WSHなんて使えねーよ。と鼻で笑われてしまうかもしれません。

なので、WSH JScript は捨てて、代替として Batファイルに Node.js の JavaScript を組み込みました。

これで Windows Bat を Node.js JavaScript で置き換えていくことでBat系開発の効率がアップするでしょう。BatファイルなのでエクスプローラなどのGUIからも呼び出しやすくて、Node.js プログラムとGUIとの連携も便利です。

Windows 版の Node.js はインストールしておいてください。

Batファイル内に Node.js JavaScript を組み込む

実例として、次のファイルを、C:\temp\test\nodeInBat\ ここに配置しました。

nodeInBat.bat
//&cls&node %0 %1&pause > nul&exit

var child_process = require('child_process');

function cmdRun(command) {
  return child_process.execSync(command).toString();
}

function cmdOut(command){
    result = cmdRun(command);
    console.log("> " + command + "\n => " + result);
  return result;
}

cmdOut( "echo test" );

ret = cmdOut( "node -v" );

console.log( "nodejsバージョン:" + ret.match( /[0-9\.]+/ )[0]);
console.log("");
console.log("引数:"+ process.argv);

var i = 0;
process.argv.toString().split(',').forEach(function(element) {
  i += 1;
  console.log(i.toString() + ' ' + element);
});

Batファイルを実行すると、コマンドプロンプトが表示されて、次の通りの出力結果になります。

> echo test
 => test

> node -v
 => v9.10.1

nodejsバージョン:9.10.1

引数:C:\Program Files\nodejs\node.exe,C:\temp\test\nodeInBat\nodeInBat.bat
1 C:\Program Files\nodejs\node.exe
2 C:\temp\test\nodeInBat\nodeInBat.bat

Batファイルに test.txt というファイルをドラッグ&ドロップで引数を渡した場合の出力結果は次の通り。

> echo test
 => test

> node -v
 => v9.10.1

nodejsバージョン:9.10.1

引数:C:\Program Files\nodejs\node.exe,C:\temp\test\nodeInBat\nodeInBat.bat,C:\temp\test\nodeInBat\test.txt
1 C:\Program Files\nodejs\node.exe
2 C:\temp\test\nodeInBat\nodeInBat.bat
3 C:\temp\test\nodeInBat\test.txt

引数を受け取ることができることも確認できました。

Batファイル先頭行の仕組み

nodeInBat.bat の先頭行の Bat ファイルの記載を説明しておきます。

この先頭行です。

//&cls&node %0 %1&pause > nul&exit
  • //

これは JavaScript ではコメントアウトですが、Batファイルでは無意味なコマンドです。Batファイルで通常この行だと、

'//' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

このように出力されます。が、次に続くコマンド

  • &cls

こちらで、出力はクリアされるので見えなくなります。

  • &node %0 %1

ここで node コマンドを呼び出していて %0 はこのファイル自身、%1 はBatに渡される引数を示します。
node コマンドに、自分自身のファイルを渡しているので、このファイルの JavaScript コードが実行されるわけです。

  • &pause

このコマンドでは、動作をとめます。

  • > nul

空ファイルに出力します。これを行わないと、pause コマンドで待機していることを示す

続行するには何かキーを押してください . . .

というメッセージが出てしまうので、これを消すためです。

  • exit

ここで、Batファイルとしての処理を終了しています。
こうすることで、この Node.js を内包した Batファイルの JavaScript 部分のコードが
Batファイルとして認識されてエラーになるのを防いでいます。

応用

先頭行から、pause と > null を除外して次のようにすると、コマンドプロンプトの表示は動作後すぐに消えます。

//&cls&node %0 %1&exit

出力結果を表示しなくてもよいようなBatプログラムの場合はこのようにしてください。

また、引数をもっとたくさん受け取りたい場合は次のようにして、%数値 を増やします。

//&cls&node %0 %1 %2 %3 %4&pause > nul&exit

参考

WindowsのバッチをNode.jsで書く雛形
https://gist.github.com/mofukuma/8f0db9624d7c34824298

こちらのコードで学ぶことができました。
感謝感謝です。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.