gpt4 book ai didi

javascript - node.js shell 命令执行

转载 作者:IT老高 更新时间:2023-10-28 21:47:10 28 4
gpt4 key购买 nike

我仍在尝试掌握如何运行 linux 或 windows shell 命令并在 node.js 中捕获输出的细节;最终,我想做这样的事情......

//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" <------

我无法理解上面的代码在哪里中断...该模型的一个非常简单的原型(prototype)可以工作...

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 的缓冲区限制。

最终分辨率

我接受 James White 的回答,但这是对我有用的确切代码...

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);

最佳答案

这里有三个问题需要解决:

首先是您在异步使用标准输出时期望同步行为。 run_cmd 函数中的所有调用都是异步的,因此它会生成子进程并立即返回,无论是否从标准输出中读取了部分、全部或没有数据。因此,当您运行时

console.log(foo.stdout);

你会得到任何发生在 foo.stdout 中的东西,并且不能保证会是什么,因为你的子进程可能仍在运行。

其次是stdout是readable stream ,所以 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:\Windows\System32\netstat.exe -an
var foo = new run_cmd(
'netstat.exe', ['-an'],
function (me, buffer) { me.stdout += buffer.toString() },
function () { console.log(foo.stdout) }
);

关于javascript - node.js shell 命令执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14458508/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com