ph-utils
Version:
js 开发工具集,前后端都可以使用(commonjs和es module)
66 lines (65 loc) • 2.19 kB
JavaScript
import { execFile, spawn as spawnOri } from "node:child_process";
import { promisify } from "node:util";
const execFilePromise = promisify(execFile);
/**
* 执行命令
* @param cmd 执行的命令
* @returns
*/
export function exec(command, ...params) {
let argvs = [];
const commandItems = command.split(" ");
const cmd = commandItems.shift();
if (commandItems.length > 0) {
argvs = commandItems;
}
let opts = { shell: true };
if (params[0] != null) {
if (params[0] instanceof Array) {
argvs.push(...params[0]);
if (params[1] != null) {
opts = params[1];
}
}
else {
opts = params[0];
}
}
return execFilePromise(cmd, argvs, opts);
}
/**
* 执行命令并返回执行结果的Promise
* @param command 要执行的命令
* @param args 命令参数数组
* @param options 执行选项,支持指定shell类型
* @returns Promise对象,成功时resolve包含stdout和stderr的对象,失败时reject包含错误信息
*/
export function spawn(command, args, options = {}) {
return new Promise((resolve, reject) => {
let execArgs = [];
let cmd;
// 根据是否指定powershell shell来设置实际执行的命令和参数
if (options.shell === 'powershell') {
cmd = 'powershell.exe';
execArgs = ['-NoProfile', '-Command', command, ...(args || [])];
}
else {
cmd = command;
execArgs = args || [];
}
delete options.shell;
const child = spawnOri(cmd, execArgs, options);
let stdout = '', stderr = '';
child.stdout.on('data', d => stdout += d);
child.stderr.on('data', d => stderr += d);
// 监听子进程关闭事件,根据退出码决定resolve或reject
child.on('close', code => {
if (code === 0)
resolve({ stdout, stderr });
else
reject(new Error(`spawn failed (${code}): ${stderr}`));
});
// 监听子进程错误事件,发生错误时直接reject
child.on('error', reject);
});
}