मैं अभी भी महीन बिंदुओं को समझने की कोशिश कर रहा हूं कि मैं एक लिनक्स या विंडोज शेल कमांड कैसे चला सकता हूं और नोड.जेएस के भीतर आउटपुट कैप्चर कर सकता हूं; आखिरकार, मैं ऐसा कुछ करना चाहता हूं ...
//pseudocode
output = run_command(cmd, args)
महत्वपूर्ण टुकड़ा यह है कि output
एक वैश्विक रूप से स्कूप्ड वैरिएबल (या ऑब्जेक्ट) के लिए उपलब्ध होना चाहिए। मैंने निम्नलिखित फ़ंक्शन की कोशिश की, लेकिन किसी कारण से, मैं undefined
कंसोल पर मुद्रित हो जाता हूं ...
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" <------
मुझे यह समझने में परेशानी हो रही है कि कोड ऊपर कहाँ टूटता है ... उस मॉडल का एक बहुत ही सरल प्रोटोटाइप काम करता है ...
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" <----
क्या कोई मुझे यह समझने में मदद कर सकता है कि try_this()
काम क्यों करता है, और run_cmd()
क्या नहीं? FWIW, मुझे उपयोग करने की आवश्यकता है child_process.spawn
, क्योंकि child_process.exec
इसमें 200KB बफर सीमा है।
अंतिम संकल्प
मैं जेम्स व्हाइट का जवाब स्वीकार कर रहा हूं, लेकिन यह सटीक कोड है जिसने मेरे लिए काम किया है ...
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 = "";
मेंcmd_exec()
श्रृंखलाबद्ध को रोकने के लिएundefined
परिणाम की शुरुआत करने के लिए।