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\
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
ふうん。
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
よし。
BATファイルで複数ファイルのドラッグドロップを認識
次に、BATファイルでnodeを実行させることにして、BATファイルに対して複数ファイルをドラッグドロップすれば引数ちゃんと出力できるか確認。
wb04.bat (shift_jis-dosで保存)
node wb02.js
実行
[ Path: ~ ] # mv wb03.txt wb03.txt.1st (BATファイルに対して複数ファイルをドラッグドロップ)
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 続行するには何かキーを押してください . . .
Windowsユーザ名が日本語なのが悪いらしい? どうすれば解決できるのか?
別のWindowsマシン(ユーザ名が英語)に変えた。これならOK?
同じエラーだ‥‥しかしよく見ると、カレントディレクトリが 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
成功だ。
しかしこれではフォルダ位置を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
実行
これでOK。