node.js shell命令执行

node.js shell命令执行,第1张

node.js shell命令执行

这里需要解决三个问题:

首先
,您期望异步使用stdout时出现同步行为。

run_cmd
函数中的所有调用都是异步的,因此无论是否已从stdout读取部分,全部或没有数据,它都会生成子进程并立即返回。因此,当您跑步时

console.log(foo.stdout);

您会得到当前存储在foo.stdout中的所有信息,并且无法保证会发生什么,因为您的子进程可能仍在运行。

其次
是stdout是可读流,因此1)可以多次调用数据事件,以及2)给回调函数提供缓冲区,而不是字符串。易于补救;只是改变

foo = new run_cmd(    'netstat.exe', ['-an'], function (me, data){me.stdout=data;});

进入

foo = new run_cmd(    'netstat.exe', ['-an'], function (me, buffer){me.stdout+=buffer.toString();});

这样我们就可以将缓冲区转换为字符串并将该字符串附加到我们的stdout变量中。

第三点 是,您只有在收到’end’事件时才能知道已收到所有输出,这意味着我们需要另一个侦听器和回调:

function run_cmd(cmd, args, cb, end) {    // ...    child.stdout.on('end', end);}

因此,您的最终结果是:

function run_cmd(cmd, args, cb, end) {    var spawn = require('child_process').spawn,        child = spawn(cmd, args),        me = this;    child.stdout.on('data', function (buffer) { cb(me, buffer) });    child.stdout.on('end', end);}// Run C:WindowsSystem32netstat.exe -anvar foo = new run_cmd(    'netstat.exe', ['-an'],    function (me, buffer) { me.stdout += buffer.toString() },    function () { console.log(foo.stdout) });


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5126653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存