Node.js 子进程运行CMD命令详解

作者:后端茶话

时间:2026-10-31

浏览:491

本文详细解析Node.js中child_process模块的三种子进程创建方法:exec、execFile和spawn。通过对比适用场景、参数配置及输出处理机制,结合具体代码示例,阐述如何高效执行CMD命令并处理标准输出与错误,帮助开发者根据数据量大小和交互需求选择最优方案。

文章目录

本文旨在阐述如何在 Node.js 环境中利用 child_process 模块,通过 exec、execFile 以及 spawn 三种不同方式创建子进程来执行 CMD 命令,并通过具体示例解析各方法的参数配置与输出处理逻辑。

在深入探讨子进程之前,首先构建一个名为 printArgs.js 的 Node.js 脚本,该脚本用于接收命令行参数并将其打印输出,后续将调用此脚本演示子进程功能。脚本代码片段如下:

// 获取命令行参数,process.argv 是一个数组,其中包含了命令行参数
// 第一个元素是 node 的路径,第二个元素是脚本文件的路径,从第三个元素开始是用户传入的参数
const args = process.argv.slice(2);

// 打印传入的参数
console.log("传入的参数为:");
args.forEach((arg, index) => {
  setTimeout(() => {
    console.log(`${index + 1}: ${arg}`);
  }, (index + 1) * 1000);
});

该脚本利用 process.argv 数组获取命令行传入的参数,并通过 setTimeout 函数模拟异步处理流程,对每个参数进行延迟打印。

  • process.argv 是 Node.js 中用于获取命令行参数的数组,其结构如下:
  • argv[0] 指向 Node.js 可执行文件的路径
  • argv[1] 指向当前正在执行的脚本文件路径
  • argv[2] 及之后的元素对应用户输入的具体参数
  • 使用 setTimeout 函数,使每个参数的打印延迟时间为 (index + 1) * 1000 毫秒

接着创建 index.js 脚本,引入 Node.js 的 child_process 模块中的三个核心方法,下文将逐一解析这三个方法的区别与应用。

const { exec, execFile, spawn } = require("child_process");

1. exec 方法

let execChild = exec(
  "node ./printArgs.js aaa bbb ccc",
  { encoding: "utf8" },
  (error, stdout, stderr) => {
    if (error) {
      console.log(`执行错误:${error}`);
      return;
    }

    if (stderr) {
      console.log(`stderr: ${stderr}`);
    }
    console.log(`stdout: ${stdout}`);
  }
);

execChild.on("close", (code) => {
  console.log(`子进程退出,退出码$[code]`);
})

方法签名: exec(command[, options][, callback])

适用场景:适用于执行单条 shell 命令并一次性获取完整输出,适合输出量较小的任务。例如,运行 printArgs 脚本后,程序将等待 3 秒,随后一次性输出 'aaa bbb ccc'。

参数说明:

  • command:完整的 shell 命令字符串。
  • encoding:指定输出编码格式,例如 "utf8"。
  • callback:回调函数,用于接收 error(错误对象)、stdout(标准输出)和 stderr(错误输出)。
  • execChild.on("close", callback):用于监听子进程关闭事件,从而获取进程的退出码。

2. execFile 方法

let fileChild = execFile(
  "node",
  ["printArgs.js", "aaa", "bbb", "ccc"],
  { encoding: "utf8", cwd: "" }, //cwd为工作目录
  (error, stdout, stderr) => {
    if (error) {
      console.error(`执行出错: ${error}`);
      return;
    }
    if (stderr) {
      console.error(`stderr: ${stderr}`);
    }
    console.log(`stdout: ${stdout}`);
  }
);

fileChild.on("close", (code) => {
  console.log(`子进程退出,退出码$[code]`);
});

方法签名: execFile(file[, args][, options][, callback])

适用场景:适用于直接运行可执行文件或脚本,无需经过 shell 解析,安全性更高。代码中通过 node 执行 printArgs 脚本,等待 3 秒后一次性输出 'aaa bbb ccc'。

参数说明:

  • file:可执行文件或脚本路径(如 node)。
  • args:参数数组,例如 ["printArgs.js", "aaa", "bbb", "ccc"]。
  • cwd:指定工作目录,空字符串表示当前目录。
  • encoding:指定输出编码格式。
  • callback:与 exec 相同,用于获取输出结果。
  • fileChild.on("close", callback):监听子进程关闭事件,获取退出码。

3. spawn 方法

const spawnChild = spawn("node", ["./printArgs.js", "aaa", "bbb", "ccc"], {
  shell: true,
}); // 在 Windows 上执行 CMD 命令时,通常需要设置 { shell: true }

spawnChild.stdout.on("data", (data) => {
  console.log(`stdout: ${data}`);
});

spawnChild.stderr.on("data", (data) => {
  console.error(`stderr: ${data}`);
});

spawnChild.on("close", (code) => {
  console.log(`子进程退出,退出码 $[code]`);
})

方法签名: spawn(command[, args][, options])

适用场景:适用于需要持续处理大数据流或监听标准输出/错误的场景(如服务器日志监控)。代码中调用 printArgs 脚本时,内容将每隔 1 秒依次输出。

参数说明:

  • command:要执行的命令。
  • args:参数数组,例如 ["./printArgs.js", "aaa", "bbb", "ccc"]。
  • shell:设置为 true 时,在 Windows 系统下推荐启用,执行 shell 命令时通常必要。
  • spawnChild.on 用于实时监听标准输出和错误流。

总结对比

方法是否用 shell适用场景是否支持大数据流回调/事件模型
exec是简单命令 + 小输出否回调函数
execFile否执行文件 + 安全性要求高否回调函数
spawn否(可选)大数据流 / 持续输出任务是事件监听

至此,关于 Node.js 子进程运行 CMD 命令的详解介绍完毕,更多相关 Node.js 子进程运行 CMD 内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章