using System.Diagnostics;
namespace MeloongCore;
public static class TaskUtils {
///
/// 静默运行程序并等待其结束,返回其输出和退出码。
/// 支持 notepad、git 等命令。
/// 超时或启动失败会抛出异常。
///
public static async Task<(string Output, int ExitCode)> RunProgramAsync(string file, string arguments = "", int? timeoutMs = null, Encoding? encoding = null, CancellationToken cancellationToken = default) {
cancellationToken.ThrowIfCancellationRequested();
var info = new ProcessStartInfo {
Arguments = arguments,
FileName = PathUtils.ToShortPath(file),
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true, StandardOutputEncoding = encoding,
RedirectStandardError = true, StandardErrorEncoding = encoding
};
using var program = new Process { StartInfo = info, EnableRaisingEvents = true };
if (!program.Start()) throw new InvalidOperationException($"运行程序时出现意外错误:{file} {arguments}");
bool hasTimeout = timeoutMs is > 0;
Logger.Info($"运行程序,并返回其输出:{file} {arguments}{(hasTimeout ? $",最长可等待 {timeoutMs}ms" : "")}");
// 输出和错误流
var outputTask = program.StandardOutput.ReadToEndAsync();
var errorTask = program.StandardError.ReadToEndAsync();
var completionSource = new TaskCompletionSource