[Windows] 拡張子をNode.jsに関連づける/ドロップアンドドロップできるようにする

カタログ
  1. 1. .nodecmd のファイルを実行可能にするレジストリ
  2. 2. .nodedh のファイルにドラッグアンドドロップでNode.jsを実行
  3. 3. ドラッグアンドドロップ後にコンソールに出力が残るvar (開発用)
  4. 4. ドラッグアンドドロップのテスト

参考: アプリケーションをファイルの拡張子に関連付ける: .NET Tips: C#, VB.NET

参考リンクを見て登録用の .reg ファイルを作成した。 登録する前にレジストリのバックアップをすること。

既にレジストリエントリが存在すると上書きされるので、ご利用は自己責任で。 レジストリ登録後Windowsの再起動が必要かもしれません。

.nodecmd のファイルを実行可能にするレジストリ

以下のテキストを .reg 拡張子で保存して実行すれば登録できる。 .node 拡張子にしたらなぜか動かない(予約語か何かだったりするのか?)ため、 .nodecmd 拡張子のファイルを実行可能とした。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.nodecmd]
@="F8.NodeJS.Cmd"

[HKEY_CLASSES_ROOT\.nodecmd\OpenWithProgids]
"F8.NodeJS.Cmd"=""

[HKEY_CLASSES_ROOT\F8.NodeJS.Cmd]

[HKEY_CLASSES_ROOT\F8.NodeJS.Cmd\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,69,00,6d,00,\
61,00,67,00,65,00,72,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,36,\
00,38,00,00,00

[HKEY_CLASSES_ROOT\F8.NodeJS.Cmd\Shell]

[HKEY_CLASSES_ROOT\F8.NodeJS.Cmd\Shell\Open]

[HKEY_CLASSES_ROOT\F8.NodeJS.Cmd\Shell\Open\Command]
@=hex(2):22,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,\
00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,\
6d,00,64,00,2e,00,65,00,78,00,65,00,22,00,20,00,2f,00,43,00,20,00,6e,00,6f,\
00,64,00,65,00,20,00,22,00,25,00,31,00,22,00,20,00,25,00,2a,00,00,00

.nodedh のファイルにドラッグアンドドロップでNode.jsを実行

事前準備として %appdata%/nodecmd.jse に下記の内容のファイルを作成する。

1
2
3
var W = WScript, a = W.Arguments, i = 0, l = a.length, s = [];
for (;i < l; i++) s.push(' "', a.Item(i), '"');
new ActiveXObject('WScript.Shell').Run('node' + s.join(''));

※試行錯誤した結果JScriptを間に噛ませたほうがよさそう(最大引数長が長くなる & 最大引数長超えた時に実行できない件のダイアログが表示される)。

ファイルの場所を変更したい場合は後から登録したレジストリを書き換える。

あとは、以下のテキストを .reg 拡張子で保存して実行すればOK。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.nodedh]
@="F8.NodeJS.DropHandler"

[HKEY_CLASSES_ROOT\.nodedh\OpenWithProgids]
"F8.NodeJS.DropHandler"=""

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler]

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,69,00,6d,00,\
61,00,67,00,65,00,72,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,36,\
00,38,00,00,00

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler\Shell]

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler\Shell\Open]

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler\Shell\Open\Command]
@=hex(2):77,00,73,00,63,00,72,00,69,00,70,00,74,00,20,00,22,00,25,00,41,00,70,\
00,70,00,44,00,61,00,74,00,61,00,25,00,5c,00,6e,00,6f,00,64,00,65,00,64,00,\
68,00,2e,00,6a,00,73,00,65,00,22,00,20,00,22,00,25,00,31,00,22,00,20,00,25,\
00,2a,00,00,00

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler\ShellEx]

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

誤操作防止のため .nodecmd とは別の拡張子 .nodedh にした。 ドラッグアンドドロップすると wscript "%AppData%\nodedh.jse" "%1" %* が実行される。 ダブルクリックやファイルをEnterで開いても実行されてしまうけれど…

ドラッグアンドドロップ後にコンソールに出力が残るvar (開発用)

開発用に、拡張子 .nodedh2 で作った。 ドラッグアンドドロップすると %SystemRoot%\system32\cmd.exe /K node "%1" %* が実行される。 やはり、ダブルクリックやファイルをEnterで開いても実行されてしまう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.nodedh2]
@="F8.NodeJS.DropHandler2"

[HKEY_CLASSES_ROOT\.nodedh2\OpenWithProgids]
"F8.NodeJS.DropHandler2"=""

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler2]

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler2\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,69,00,6d,00,\
61,00,67,00,65,00,72,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,36,\
00,38,00,00,00

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler2\Shell]

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler2\Shell\Open]

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler2\Shell\Open\Command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6d,00,\
64,00,2e,00,65,00,78,00,65,00,20,00,2f,00,4b,00,20,00,6e,00,6f,00,64,00,65,\
00,20,00,22,00,25,00,31,00,22,00,20,00,25,00,2a,00,00,00

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler2\ShellEx]

[HKEY_CLASSES_ROOT\F8.NodeJS.DropHandler2\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

ドラッグアンドドロップのテスト

以下のテキストを .nodedh 拡張子で保存して、 そのファイルに他のファイルをドラッグアンドドロップすると、 ドラッグアンドドロップしたファイル名が %temp%\\hoge-piyo-foobar.txt に書き込まれるはず。 .nodedh2 拡張子にすればコンソールでも確認可能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var fs = require('fs');
var result = [];

// 第1引数は node.exe のパス
result.push('node.exe path: ' + process.argv[0]);

// 第2引数はドロップアンドドロップ先のファイル
result.push('nodedh path: ' + process.argv[1]);

// 第3引数以降はドロップアンドドロップしたファイル
for (var i = 2, droppedFilePath; droppedFilePath = process.argv[i]; i++) {
result.push('dropped' + (i - 1) + ': ' + droppedFilePath);
}

// %temp%\hoge-piyo-foobar.txt に実行結果を保存
var result = result.join('\n');
console.log(result);
fs.writeFileSync('hoge-piyo-foobar.txt', result);