J'essaie toujours de saisir les points les plus fins de la façon dont je peux exécuter une commande shell linux ou Windows et capturer la sortie dans node.js ; finalement, je veux faire quelque chose comme ceci...
//pseudocode
output = run_command(cmd, args)
L'élément important est que output
doit être disponible pour une variable (ou un objet) à portée globale. J'ai essayé la fonction suivante, mais pour une raison quelconque, j'obtiens undefined
imprimé à la console...
function run_cmd(cmd, args, cb) {
var spawn = require('child_process').spawn
var child = spawn(cmd, args);
var me = this;
child.stdout.on('data', function(me, data) {
cb(me, data);
});
}
foo = new run_cmd('dir', ['/B'], function (me, data){me.stdout=data;});
console.log(foo.stdout); // yields "undefined" <------
J'ai du mal à comprendre où le code est cassé ci-dessus... un prototype très simple de ce modèle fonctionne...
function try_this(cmd, cb) {
var me = this;
cb(me, cmd)
}
bar = new try_this('guacamole', function (me, cmd){me.output=cmd;})
console.log(bar.output); // yields "guacamole" <----
Quelqu'un peut-il m'aider à comprendre pourquoi try_this()
travaux, et run_cmd()
ne le fait pas ? Pour info, j'ai besoin d'utiliser child_process.spawn
parce que child_process.exec
a une limite de mémoire tampon de 200KB.
Résolution finale
J'accepte la réponse de James White, mais voici le code exact qui a fonctionné pour moi...
function cmd_exec(cmd, args, cb_stdout, cb_end) {
var spawn = require('child_process').spawn,
child = spawn(cmd, args),
me = this;
me.exit = 0; // Send a cb to set 1 when cmd exits
me.stdout = "";
child.stdout.on('data', function (data) { cb_stdout(me, data) });
child.stdout.on('end', function () { cb_end(me) });
}
foo = new cmd_exec('netstat', ['-rn'],
function (me, data) {me.stdout += data.toString();},
function (me) {me.exit = 1;}
);
function log_console() {
console.log(foo.stdout);
}
setTimeout(
// wait 0.25 seconds and print the output
log_console,
250);
2 votes
Dans la résolution finale, vous devez définir
me.stdout = "";
surcmd_exec()
pour empêcher la concaténationundefined
au début du résultat.0 votes
Hé, ce code de résolution finale est complètement affreux, et si cela prend plus de 0,25 seconde pour exécuter votre netstat ?
0 votes
Ummmm... peut-être utiliser une des réponses auxquelles j'ai attribué un bonus ?????.
0 votes
Duplicata possible de Exécuter et obtenir la sortie d'une commande shell dans node.js