当我通过节点运行此命令时:
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上。有什么想法吗?
5条答案
按热度按时间yebdmbv41#
正如badsyntax所指出的,只要你没有创建别名,ls在windows上就不存在,你将使用'dir',区别在于dir不是一个程序,而是windows shell中的一个命令(cmd.exe),所以你需要运行带参数的'cmd'来运行dir并输出流。
通过使用“inherit”,输出将通过管道传送到当前进程。
chhkpiq42#
对于每个文档的节点8,您需要将shell选项设置为true(默认情况下为false)。
此处提供文档
vmjh9lq93#
(首先,
ls
是否真的存在于Windows上?)不久前,我在生成子进程时遇到过类似的问题,我花了很长时间才找到正确的方法。
下面是一些示例代码:
请查看此票证以了解此问题的说明:https://github.com/joyent/node/issues/2318
[2022年12月25日更新]根据Gorky's answer,只需设置
shell: true
pgx2nnw84#
对这个问题已有两个可行的答案,但我想再提一个,并澄清一些问题。
如果您不打算从命令中返回大量数据(超过200 kB),可以使用exec而不是spawn,并更优雅地编写:
阅读difference between spawn and exec.以确保它符合您的需要。
对于澄清,无需通过{stdio:'inherit'}来派生,因为它在默认情况下创建管道。请参阅文档:
默认情况下,stdin、stdout和stderr的管道是在父Node.js进程和派生的子进程之间建立的。可以通过这些管道以非阻塞方式传输数据。但是请注意,一些程序在内部使用行缓冲I/O。虽然这不会影响Node.js,但可能意味着发送到子进程的数据可能不会立即使用。
ru9i0ody5#
嗨下面的代码为我工作。