using System.Diagnostics; using HanaToolbox.Logging; using HanaToolbox.Services.Interfaces; namespace HanaToolbox.Services; /// Runs external processes and captures stdout/stderr. public sealed class ProcessRunner(AppLogger logger) : IProcessRunner { public async Task RunAsync( string executable, string[] args, CancellationToken ct = default) { var psi = new ProcessStartInfo { FileName = executable, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, }; foreach (var arg in args) psi.ArgumentList.Add(arg); logger.Info($"Exec: {executable} {string.Join(' ', args)}"); using var process = new Process { StartInfo = psi }; process.Start(); var stdoutTask = process.StandardOutput.ReadToEndAsync(ct); var stderrTask = process.StandardError.ReadToEndAsync(ct); await process.WaitForExitAsync(ct); var stdout = await stdoutTask; var stderr = await stderrTask; logger.Info($"Exit code: {process.ExitCode}"); if (!string.IsNullOrWhiteSpace(stderr)) logger.Info($"Stderr: {stderr.Trim()}"); return new ProcessResult(process.ExitCode, stdout.Trim(), stderr.Trim()); } }