节点生成子进程在 Windows 中不起作用

Cor*_*ing 2 windows spawn node.js

我有一个在 Windows 上使用 spawn 的简单脚本设置,其输​​出是:

spawn error: Error: spawn dir ENOENT
spawn child process closed with code -4058
Run Code Online (Sandbox Code Playgroud)

这是代码:

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

const spawnTest = (() => {
  const dir = spawn('dir');

  dir.stdout.on('data', (data) => {
    console.log(`spawn stdout: ${data}`);
  });

  dir.stderr.on('data', (data) => {
    console.log(`spawn stderr: ${data}`);
  });

  dir.on('error', (code) => {
    console.log(`spawn error: ${code}`);
  });

  dir.on('close', (code) => {
    console.log(`spawn child process closed with code ${code}`);
  });

  dir.on('exit', (code) => {
    console.log(`spawn child process exited with code ${code}`);
  });
})();
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 10

您需要as 中shell: true的选项。 spawn()spawn('dir', {shell: true});

此代码在 Windows 上按预期工作:

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

const spawnTest = (() => {
  const dir = spawn('dir', {shell: true});       // <== shell: true option

  dir.stdout.on('data', (data) => {
    console.log(`spawn stdout: ${data}`);
  });

  dir.stderr.on('data', (data) => {
    console.log(`spawn stderr: ${data}`);
  });

  dir.on('error', (code) => {
    console.log(`spawn error: ${code}`);
  });

  dir.on('close', (code) => {
    console.log(`spawn child process closed with code ${code}`);
  });

  dir.on('exit', (code) => {
    console.log(`spawn child process exited with code ${code}`);
  });
})();
Run Code Online (Sandbox Code Playgroud)

我的猜测是,因为dir这不是一个实际的程序(Windows 中没有dir.exe),所以您必须告诉spawn()命令它是应该在命令 shell 中运行还是没有命令 shell 运行。而在其他平台上,诸如此类的东西ls是可以以任何方式运行的实际程序。