[child_process.exec()] 和 [child_process.execFile()] 之间区别的重要性可能因平台而异。 在 Unix 类型的操作系统(Unix、Linux、macOS)上,[child_process.execFile()] 可以更高效,因为默认情况下不会衍生 shell。 但是在 Windows 上,.bat.cmd 文件在没有终端的情况下不能自行执行,因此无法使用 [child_process.execFile()] 启动。 当在 Windows 上运行时,要调用 .bat.cmd 文件,可以使用设置了 shell 选项的 [child_process.spawn()]、或 [child_process.exec()]、或衍生 cmd.exe 并将 .bat.cmd 文件作为参数传入(也就是 shell 选项和 [child_process.exec()] 所做的)。 在任何情况下,如果脚本的文件名包含空格,则需要加上引号。

    1. // 仅在 Windows 上。
    2. const { spawn } = require('child_process');
    3. const bat = spawn('cmd.exe', ['/c', 'my.bat']);
    4. bat.stdout.on('data', (data) => {
    5. console.log(data.toString());
    6. });
    7. bat.stderr.on('data', (data) => {
    8. console.error(data.toString());
    9. });
    10. bat.on('exit', (code) => {
    11. console.log(`子进程退出,退出码 ${code}`);
    12. });
    1. // 或:
    2. const { exec, spawn } = require('child_process');
    3. exec('my.bat', (err, stdout, stderr) => {
    4. if (err) {
    5. console.error(err);
    6. return;
    7. }
    8. console.log(stdout);
    9. });
    10. // 文件名中包含空格的脚本:
    11. const bat = spawn('"my script.cmd"', ['a', 'b'], { shell: true });
    12. // 或:
    13. exec('"my script.cmd" a b', (err, stdout, stderr) => {
    14. // ...
    15. });