node.js - Node 生成子进程在 Windows 中不起作用

标签 node.js windows spawn

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

spawn error: Error: spawn dir ENOENT
spawn child process closed with code -4058

代码如下:

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

最佳答案

您需要 spawn()shell: true 选项,如 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}`);
  });
})();

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

关于node.js - Node 生成子进程在 Windows 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60386867/

相关文章:

javascript - 如何限制 Node js中的并行http请求数?

node.js - Node 二进制Buffer.toString(),转换回Buffer

node.js - 安装新模块后如何刷新 package.json 文件?

javascript - Symfony2 + NodeJS + AngularJS?

node.js - 如何传递 Node 生成中的所有当前环境变量?

windows - 如何将所有快捷方式重定向到给定的可执行文件? Windows 上是否有任何等同于符号链接(symbolic link)的东西?

c++ - 将 vector<fooType> foo[num] 移植到 Windows(无 C99)

c - Windows CE 上的 libcurl - curl_easy_perform(...) 不返回

调用 exec() 或 spawn(P_OVERLAY) 解锁控制台;有什么方法可以阻止控制台?

c - C 中时间过去后生成