node.jsで複数ファイルのドラッグドロップを受け取る(Windows)

node.jsのWindows版を使い、「複数ファイルをドラッグドロップしてnode.jsのスクリプトに読み込ませる」手段を探る。


node.jsインストール

node-v0.8.16-x86.msiで Node.js ver0.8.16をインストール。
この時点で
Windowsユーザの環境変数

PATH=C:\Documents and Settings\既定\Application Data\npm\

Windowsシステムの環境変数

PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\nodejs\

となっているので、コマンドプロンプトなら、どのフォルダからでもnode.exeにアクセスできる。



node.jsのコマンドライン引数の扱い

まず、node.jsで引数をどう受け取るか調べる。

「複数ファイルを引数に指定」‥ C言語でいうargvだなと「argv node.js」検索したらprocess.argvが公式マニュアルにあった
そのサンプルどおり
wb01.js

process.argv.forEach(function (val, index, array){
  console.log(index + ':' + val);
});

実行

[ Path: ~ ]
# node wb01.js a b c
0:C:\Program Files\nodejs\node.exe
1:C:\home\local\gnupack_basic-8.00\home\wb01.js
2:a
3:b
4:c

f:id:itouhiro:20121223154731g:plain

ふうん。


node.jsで引数をファイル出力

次に、結果をファイル出力する。
wb02.js

var fs=require('fs');
var content='';
process.argv.forEach(function (val, index, array){
  //console.log(index + ':' + val);
  content += index + ':' + val + "\n";
});
fs.writeFile('wb03.txt', content);

実行

[ Path: ~ ]
# node wb02.js a b c

[ Path: ~ ]
# cat wb03.txt
0:C:\Program Files\nodejs\node.exe
1:C:\home\local\gnupack_basic-8.00\home\wb02.js
2:a
3:b
4:c

f:id:itouhiro:20121223155016g:plain

よし。



BATファイルで複数ファイルのドラッグドロップを認識

次に、BATファイルでnodeを実行させることにして、BATファイルに対して複数ファイルをドラッグドロップすれば引数ちゃんと出力できるか確認。
wb04.bat (shift_jis-dosで保存)

node wb02.js

実行

[ Path: ~ ]
# mv wb03.txt wb03.txt.1st
(BATファイルに対して複数ファイルをドラッグドロップ)

f:id:itouhiro:20121223155530g:plain


wb03.txtが出力されない。なぜだろう
wb04.batを単体でダブルクリックすればwb03.txtは出力されるが、BATにファイルドラッグドロップした場合は、一瞬コマンドプロンプトのウィンドウが表示されるのだがそのあとwb03.txt出力されない。




google検索「bat ドラッグドロップ」するとpauseでドラッグドロップしたときの出現ウィンドウを消さずにすむようだ。「%*」でドラッグドロップしたファイル名を取得できる。
wb10.bat

node wb02.js %*
pause

実行

C:\Documents and Settings\既定>node wb02.js C:\home\local\gnupack_basic-8.00\home\.inputrc C:\home\local\gnupack_basic-8.00\home\.migemo-pattern

module.js:340
    throw err;
          ^
Error: Cannot find module 'C:\Documents and Settings\譌「螳喀wb02.js'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.runMain (module.js:492:10)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

C:\Documents and Settings\既定>pause
続行するには何かキーを押してください . . .

f:id:itouhiro:20121223154214g:plain


Windowsユーザ名が日本語なのが悪いらしい? どうすれば解決できるのか?


別のWindowsマシン(ユーザ名が英語)に変えた。これならOK?
f:id:itouhiro:20121224175325p:plain
同じエラーだ‥‥しかしよく見ると、カレントディレクトリが C:\Windows\Fonts になってるじゃん。さっきもこのせいで失敗していたのか。


カレントディレクトリを明示的に指定してみよう。
wb11.bat

cd C:\home\bin\gnupack\home
node wb02.js %*
pause

実行

0:node
1:C:\home\bin\gnupack\home\wb02.js
2:C:\home\bin\gnupack\home\.inputrc

f:id:itouhiro:20121224175849p:plain
成功だ。

しかしこれではフォルダ位置をC:\home\bin\gnupack\home以外に変えるだけで動作しなくなるので再利用性が低い。batファイルのある場所を取得したいのだが‥‥



http://blog.goo.ne.jp/limited_terra/e/3b7d0b570431dc6eba763335491e0fa0

%~pI	%I をパス名だけに展開します。

これを使ってみる。

wb12.bat

cd %~p0
node wb02.js %*
pause

実行
f:id:itouhiro:20121224181457p:plain
これでOK。