当我通过Node运行时:
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上。有什么想法吗?
答案 0 :(得分:13)
正如badsyntax指出的那样,只要你没有创建别名,ls就不存在于Windows上。你会用'dir'。区别在于dir不是程序,而是windows shell中的命令(cmd.exe),因此您需要运行带有参数的'cmd'来运行dir并输出流。
var spawn = require('child_process').spawn
spawn('cmd', ['/c', 'dir'], { stdio: 'inherit'})
通过使用'inherit',输出将通过管道输出到当前进程。
答案 1 :(得分:11)
(首先,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
答案 2 :(得分:2)
答案 3 :(得分:1)
这个问题已有两个有效的答案,但我想再提一个并澄清一些事情。
如果您不打算从命令中返回大量数据(超过200kB),则可以使用exec而不是spawn,并且更优雅地写:
exec('dir [possible arguments]', (err, stdout, stderr) => {
console.log(`stdout: ${stdout}`)
})
了解difference between spawn and exec。确保它符合您的需求。
至于澄清,没有必要将{stdio:' inherit'}传递给spawn,因为它默认创建管道。来自the documentation:
默认情况下,stdin,stdout和stderr之间建立管道 父Node.js进程和生成的子进程。有可能 通过这些管道以非阻塞方式传输数据。但请注意, 某些程序在内部使用行缓冲I / O.虽然如此 不影响Node.js,它可以表示发送给子进程的数据 可能不会立即消费。
答案 4 :(得分: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}`);
});