17

node.jsでspawnを使用して「doSomething./myfiles/*.csv」のようなコマンドを実行したいと思います。execの代わりにspawnを使用したいのは、これはある種の監視プロセスであり、stdout出力が必要だからです。

私はこれを試しました

var spawn = require('child_process').spawn; 
spawn("doSomething", ["./myfiles/*.csv"]);

ただし、ワイルドカード*.csvは解釈されません。

spawn()を使用するときにワイルドカードを使用することはできませんか?この問題を解決する他の可能性はありますか?

ありがとう

トーベン

4

3 に答える 3

10

*シェルによって展開されておりchild_process.spawn、引数は文字列として渡されるため、適切に展開されることはありません。の制限ですspawn。代わりに試すことができますchild_process.exec。これにより、シェルがワイルドカードを適切に展開できるようになります。

var exec = require("child_process").exec;

var child = exec("doSomething ./myfiles/*.csv",function (err,stdout,stderr) {
    // Handle result
});

spawn何らかの理由で本当に使用する必要がある場合は、子プロセスを作成する前に、node-glob のような lib を使用して Node でワイルドカード ファイル パターンを自分で拡張することを検討できますか?

アップデート

Joyent ノードのコア コードでは、spawn完全なシェル ワイルドカード展開を保持しながら、シェルで任意のコマンドを呼び出すアプローチを確認できます。

https://github.com/joyent/node/blob/937e2e351b2450cf1e9c4d8b3e1a4e2a2def58bb/lib/child_process.js#L589

そして、ここにいくつかの擬似コードがあります:

var child;
var cmd = "doSomething ./myfiles/*.csv";

if ('win32' === process.platform) {
    child = spawn('cmd.exe', ['/s', '/c', '"' + cmd + '"'],{windowsVerbatimArguments:true} );
} else {
    child = spawn('/bin/sh', ['-c', cmd]);
}
于 2014-02-11T11:20:18.543 に答える
0

どのOSを使用していますか?Unix ファミリーの OS (Linux、MacOS など) では、プログラムは、シェル プロセスがワイルドカード ファイル名引数を展開し、その展開を に渡すことを想定していますargv[]。Windows OS では、プログラムは通常、ワイルドカード自体を展開する必要があることを想定しています (ただし、Windows ネイティブ プログラムの場合のみ。移植された Unix ファミリー プログラムは、せいぜい互換レイヤーを介して引数を実行しようとする可能性があります)。

あなたの構文は、Unix 系システム用のようです。その場合、呼び出すspawn()とシェル展開がバイパスされ、子プロセスは引数のドットとアスタリスクを文字通り扱います。sh child_processの代わりに使用してみて、child_processより良い結果が得られるかどうかを確認してください。

于 2012-07-30T10:02:26.013 に答える