Files
HanaToolbox/Services/ProcessRunner.cs
2026-03-02 20:53:28 +01:00

44 lines
1.4 KiB
C#

using System.Diagnostics;
using HanaToolbox.Logging;
using HanaToolbox.Services.Interfaces;
namespace HanaToolbox.Services;
/// <summary>Runs external processes and captures stdout/stderr.</summary>
public sealed class ProcessRunner(AppLogger logger) : IProcessRunner
{
public async Task<ProcessResult> 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());
}
}