Windows版node.jsでspawn()の実行コマンドにフルパスを指定する方法について

4,410 views
Skip to first unread message

竹内佑介

unread,
May 19, 2013, 5:52:39 AM5/19/13
to node...@googlegroups.com
お世話になっています、竹内です。


Wdinwos版node.jsでspawn()に実行させるコマンドをフルパスで与えた場合に、
以下のようなエラーが出てしまいコマンドが実行されませんでした。

{ [Error: spawn ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn' }

このプログラムはnode.jsからspawn()を使用して、
外部コマンドであるstd.batの呼び出しを実行するものです。



~node.jsのソースコード~
var child_process = require('child_process');

var command = 'C:\cmd\std.bat';
var args = [];
var options = {
    'cwd' : 'C:\\cmd\\'
};

var child = child_process.spawn(command,args,options);

child.stdout.setEncoding('utf8');
child.stdout.on('data' , function(data) {
    console.log('stdout : ' + data);
});

child.on('exit', function(code) {
    console.log('child process done width ' + code);
});

child.on('error', function(err) {
    console.log(err);
});

child.stderr.setEncoding('utf8');
child.stderr.on('data' , function(data) {
    concole.log('std err : '+data);
});


~std.bat~
@echo off
echo test




node.jsのソースコードと同じ階層にstd.batを置いて相対パスで指定した場合は外部コマンド呼び出しに成功しましたが、
これをフルパスで指定するとエラー出てしまいます。
エラーコードである「ENOENT」を調べてみると、指定されたファイルおよびディレクトリがないという意味なので、
おそらくパス指定の問題なのではと考えています。

基本的な質問になってしまうのですが、
Windows版spawn()の実行コマンドにフルパスを指定する方法について教えて頂けないでしょうか。
Message has been deleted
Message has been deleted

Shigeki Ohtsu

unread,
May 19, 2013, 10:18:45 PM5/19/13
to node...@googlegroups.com
大津です。

Node の spawn() の問題というより、単なるJavaScriptの文字列指定の問題なんですが、「\文字列」はエスケープシーケンスとして認識されるので、パス中の
\をJavaScriptの文字列で利用するなら \\ と書かないといけません。

なので、

var command = 'C:\\cmd\\std.bat';

と書いたらたぶんうまく動くでしょう。

一度 command 変数を console.log() などで確認されたらよいかと思います。
> --
>
> ---
> このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、nodejs_jp+...@googlegroups.com にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

竹内佑介

unread,
May 20, 2013, 12:16:04 AM5/20/13
to node...@googlegroups.com
大津さん

教えて頂いた方法で、フルパスコマンドのコマンドをたたくことができました。
また、コンソールログを出して確認をしたところ、「C:\cmdstd.bat」となっていたので、
ご指摘通りエスケープシーケンスの問題でした。



2013年5月19日日曜日 18時52分39秒 UTC+9 竹内佑介:

西澤和晃

unread,
May 20, 2013, 6:40:13 PM5/20/13
to node...@googlegroups.com
遅れたリプライですが...

他の方法です。

\\ の代わりに / を使うと、ややこしい問題は起こりません。
Windowsではバックスラッシュ(エンマーク)でもスラッシュでも同じ様に指定できます。
"c:/cmd/std.bat" と指定しましょう。

古いアプリと INI ファイル形式でコマンド起動、ファイルのやりとりを行うのですが、
Escape しなくてもいいように、全部スラッシュ(/) を使うようにしました。






2013年5月20日 13:16 竹内佑介 <kaido...@gmail.com>:

--
Reply all
Reply to author
Forward
0 new messages