在 Windows 上衍生 .bat 和 .cmd 文件
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('node: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(`Child exited with code ${code}`);
});
// 或者...
const { exec, spawn } = require('node: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) => {
// ...
});
The importance of the distinction between child_process.exec()
and
child_process.execFile()
can vary based on platform. On Unix-type
operating systems (Unix, Linux, macOS) child_process.execFile()
can be
more efficient because it does not spawn a shell by default. On Windows,
however, .bat
and .cmd
files are not executable on their own without a
terminal, and therefore cannot be launched using child_process.execFile()
.
When running on Windows, .bat
and .cmd
files can be invoked using
child_process.spawn()
with the shell
option set, with
child_process.exec()
, or by spawning cmd.exe
and passing the .bat
or
.cmd
file as an argument (which is what the shell
option and
child_process.exec()
do). In any case, if the script filename contains
spaces it needs to be quoted.
// On Windows Only...
const { spawn } = require('node: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(`Child exited with code ${code}`);
});
// OR...
const { exec, spawn } = require('node:child_process');
exec('my.bat', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
});
// Script with spaces in the filename:
const bat = spawn('"my script.cmd"', ['a', 'b'], { shell: true });
// or:
exec('"my script.cmd" a b', (err, stdout, stderr) => {
// ...
});