12

当我通过节点运行它时:

var spawn = require('child_process').spawn;

ls = spawn('ls', ['C:\\Users']);

ls.on('error', function (err) {
  console.log('ls error', err);
});

ls.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
});

ls.on('close', function (code) {
    console.log('child process exited with code ' + code);
});

我收到以下错误:

ls error { [Error: spawn ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn' }
child process exited with code -1

在 Windows Server 2012 上。有什么想法吗?

4

5 回答 5

16

正如badsyntax指出的那样,只要您没有创建别名,Windows 上就不存在 ls 。您将使用“目录”。不同之处在于 dir 不是程序,而是 windows shell 中的命令(即 cmd.exe),因此您需要运行带有参数的 'cmd' 来运行 dir 并输出流。

var spawn = require('child_process').spawn
spawn('cmd', ['/c', 'dir'], { stdio: 'inherit'})

通过使用“继承”,输出将通过管道传输到当前进程。

于 2014-01-27T21:06:10.507 回答
14

(首先,确实ls存在于 Windows 上吗?)

不久前,我在产生子进程时遇到了类似的问题,我花了很长时间才弄清楚正确的做法。

这是一些示例代码:

var spawn = require('child_process').spawn;
var cp = spawn(process.env.comspec, ['/c', 'command', '-arg1', '-arg2']);

cp.stdout.on("data", function(data) {
    console.log(data.toString());
});

cp.stderr.on("data", function(data) {
    console.error(data.toString());
});

查看这张票以了解问题的解释:https ://github.com/joyent/node/issues/2318

于 2013-08-20T12:02:42.463 回答
14

从每个文档的节点 8 开始,您需要将 shell 选项设置为 true(默认为 false)。

spawn('dir', [], { shell: true })

文档在这里

于 2018-07-19T08:21:24.140 回答
2

这个问题已经有两个可行的答案,但我想再提一个并澄清一些事情。

如果您不打算从命令中返回大量数据(超过 200kB),则可以使用 exec 而不是 spawn 并更优雅地编写:

exec('dir [possible arguments]', (err, stdout, stderr) => {
    console.log(`stdout: ${stdout}`)
})

阅读spawn 和 exec 之间的区别。以确保它符合您的需求。

至于澄清,不需要传递 {stdio: 'inherit'} 来生成,因为它默认创建管道。从文档

默认情况下,stdin、stdout 和 stderr 的管道在父 Node.js 进程和衍生的子进程之间建立。可以以非阻塞方式通过这些管道传输数据。但是请注意,某些程序在内部使用行缓冲 I/O。虽然这不会影响 Node.js,但这可能意味着发送到子进程的数据可能不会立即被使用。

于 2016-10-21T15:43:19.753 回答
1

嗨,下面的代码对我有用..

const spawn = require('child_process').spawn;
const bat = spawn('cmd.exe', ['/c','calc.exe']);

bat.stdout.on('data', (data) => {
  console.log(data);
});

bat.stderr.on('data', (data) => {
  console.log(data);
});

bat.on('closed', (code) => {
 alert(`Child exited with code ${code}`);
});
于 2016-12-07T10:19:44.997 回答