【问题标题】:Spawn on Node JS (Windows Server 2012)在 Node JS 上生成 (Windows Server 2012)
【发布时间】:2013-08-22 10:52:11
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    (首先,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】:

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

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

      通过使用'inherit',输出将通过管道传送到当前进程。

      【讨论】:

        【解决方案3】:

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

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

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

        了解difference between spawn and exec。以确保它符合您的需求。

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

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

        【讨论】:

          【解决方案4】:

          您好,下面的代码对我有用..

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

          【讨论】:

            【解决方案5】:

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

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

            文档here

            【讨论】:

            • 这是最新最好的答案恕我直言。
            • 这是最好的答案,因为它涵盖了所有其他人的答案。事实上,shell: true 使用 process.env.comspec 并在 windows 上回退到 cmd /c 而在 unix 系统上使用 /bin/sh
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-22
            • 2013-01-11
            • 2014-06-19
            • 1970-01-01
            • 1970-01-01
            • 2013-02-16
            相关资源
            最近更新 更多