ZDecode
Snippets

Node

执行命令行

点击展开代码
import { Buffer } from 'node:buffer'
import { spawn } from 'node:child_process'
import process from 'node:process'
/**
 *
 * @param {string} command
 * @param {ReadonlyArray<string>} args
 * @param {object} options
 * @returns {Promise<{ ok: boolean; code: number | null; stderr: string; stdout: string;}>} returns
 */
export async function exec(command, args, options) {
  return new Promise((resolve, reject) => {
    const _process = spawn(command, args, {
      stdio: [
        'ignore', // stdin
        'pipe', // stdout
        'pipe', // stderr
      ],
      ...options,
      shell: process.platform === 'win32',
    })

    const /** @type {Buffer[]} */ stderrChunks = []

    const /** @type {Buffer[]} */ stdoutChunks = []

    _process.stderr?.on('data', (chunk) => {
      stderrChunks.push(chunk)
    })

    _process.stdout?.on('data', (chunk) => {
      stdoutChunks.push(chunk)
    })

    _process.on('error', (error) => {
      reject(error)
    })

    _process.on('exit', (code) => {
      const ok = code === 0
      const stderr = Buffer.concat(stderrChunks).toString('utf-8').trim()
      const stdout = Buffer.concat(stdoutChunks).toString('utf-8').trim()
      const result = { ok, code, stderr, stdout }
      resolve(result)
    })
  })
}

On this page