Spa JS上的Spawn(Windows Server 2012)

时间:2013-08-20 11:46:17

标签: windows node.js windows-server-2012 spawn

当我通过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上。有什么想法吗?

5 个答案:

答案 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)

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

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

文档here

答案 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}`);
});