Ich versuche immer noch, die Feinheiten zu erfassen, wie ich einen Linux- oder Windows-Shell-Befehl ausführen und die Ausgabe in node.js erfassen kann. letztendlich möchte ich so etwas machen ...
//pseudocode
output = run_command(cmd, args)
Das wichtige output
Element ist, dass es für eine Variable (oder ein Objekt) mit globalem Gültigkeitsbereich verfügbar sein muss. Ich habe die folgende Funktion ausprobiert, aber aus irgendeinem Grund werde ich undefined
auf der Konsole gedruckt ...
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" <------
Ich habe Probleme zu verstehen, wo der Code oben kaputt geht ... ein sehr einfacher Prototyp dieses Modells funktioniert ...
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" <----
Kann mir jemand helfen zu verstehen, warum try_this()
funktioniert und run_cmd()
nicht? FWIW muss ich verwenden child_process.spawn
, da child_process.exec
es ein Pufferlimit von 200 KB gibt.
Endgültige Lösung
Ich akzeptiere James Whites Antwort, aber das ist genau der Code, der für mich funktioniert hat ...
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);
me.stdout = "";
incmd_exec()
verhindern verkettenundefined
zu Beginn des Ergebnisses.