UNPKG

ph-utils

Version:

js 开发工具集,前后端都可以使用(commonjs和es module)

66 lines (65 loc) 2.19 kB
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); }); }