first commit
This commit is contained in:
43
Services/ProcessRunner.cs
Normal file
43
Services/ProcessRunner.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user