[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()
] 所做的)。
在任何情况下,如果脚本的文件名包含空格,则需要加上引号。
// 仅在 Windows 上。
const { spawn } = require('child_process');
const bat = spawn('cmd.exe', ['/c', 'my.bat']);
bat.stdout.on('data', (data) => {
console.log(data.toString());
});
bat.stderr.on('data', (data) => {
console.error(data.toString());
});
bat.on('exit', (code) => {
console.log(`子进程退出,退出码 ${code}`);
});
// 或:
const { exec, spawn } = require('child_process');
exec('my.bat', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
});
// 文件名中包含空格的脚本:
const bat = spawn('"my script.cmd"', ['a', 'b'], { shell: true });
// 或:
exec('"my script.cmd" a b', (err, stdout, stderr) => {
// ...
});