using CliWrap; using CliWrap.Buffered; using CoreAgent.Domain.Interfaces; using Microsoft.Extensions.Logging; namespace CoreAgent.Infrastructure.Command; /// /// Windows命令策略实现 /// public class WindowsCommandStrategy : ICommandStrategy { private readonly ILogger _logger; public WindowsCommandStrategy(ILogger logger) { _logger = logger; } public async Task ExecuteBufferedAsync(string arguments, Action onOutputReceived, CancellationTokenSource source) { try { _logger.LogDebug("start ExecuteAsync cmd :{Arguments}", arguments); var cmd = Cli.Wrap("cmd.exe") .WithArguments($"/c {arguments}") .WithStandardOutputPipe(PipeTarget.ToDelegate(onOutputReceived)) .WithStandardErrorPipe(PipeTarget.ToDelegate(onOutputReceived)) .WithValidation(CommandResultValidation.None); var result = await cmd.ExecuteBufferedAsync(source.Token); _logger.LogInformation("{Arguments} result:{IsSuccess}", arguments, result.IsSuccess); } catch (Exception ex) { _logger.LogError(ex, "ExecuteAsync cmd {Arguments} failed", arguments); } } public async Task ExecuteBufferedAsync(string arguments, CancellationTokenSource source) { try { _logger.LogDebug("start ExecuteAsync cmd :{Arguments}", arguments); var cmd = Cli.Wrap("cmd.exe") .WithArguments($"/c {arguments}") .WithValidation(CommandResultValidation.None); var cmdResult = await cmd.ExecuteBufferedAsync(source.Token); string result = string.Empty; if (cmdResult.IsSuccess) result = cmdResult.StandardOutput; else result = cmdResult.StandardError; _logger.LogDebug("ExecuteAsync cmd :{Arguments} StandardOutput:{Output} :StandardError {Error}", arguments, cmdResult.StandardOutput, cmdResult.StandardError); return result; } catch (Exception ex) { _logger.LogError(ex, "ExecuteAsync cmd {Arguments} failed", arguments); return string.Empty; } } public async Task ExecuteAsync(string arguments, CancellationTokenSource source) { try { _logger.LogDebug("start ExecuteAsync cmd :{Arguments}", arguments); var cmd = await Cli.Wrap("cmd.exe") .WithArguments($"/c {arguments}") .ExecuteAsync(source.Token); _logger.LogDebug("ExecuteAsync cmd :{Arguments} :result {IsSuccess}", arguments, cmd.IsSuccess); return cmd.IsSuccess; } catch (Exception ex) { _logger.LogError(ex, "ExecuteAsync cmd {Arguments} failed", arguments); return false; } } public async Task ExecuteBufferedAsync(string[] arguments, CancellationTokenSource source, string command = "powershell.exe") { try { _logger.LogDebug("start ExecuteAsync cmd :{Arguments}", arguments); var cmd = Cli.Wrap(command) .WithArguments(arguments) .WithValidation(CommandResultValidation.None); var cmdResult = await cmd.ExecuteBufferedAsync(source.Token); string result = string.Empty; if (cmdResult.IsSuccess) result = cmdResult.StandardOutput; else result = cmdResult.StandardError; _logger.LogDebug("ExecuteAsync cmd :{Arguments} :result {Result}", arguments, result); return result; } catch (Exception ex) { _logger.LogError(ex, "ExecuteAsync cmd {Arguments} failed", arguments); return string.Empty; } } public async Task ExecuteAsync(string[] arguments, CancellationTokenSource source, string command = "powershell.exe") { try { _logger.LogDebug("start ExecuteAsync cmd :{Arguments}", arguments); var cmd = await Cli.Wrap(command) .WithArguments(arguments) .WithValidation(CommandResultValidation.None) .ExecuteAsync(source.Token); return cmd.IsSuccess; } catch (Exception ex) { _logger.LogError(ex, "ExecuteAsync cmd {Arguments} failed", arguments); return false; } } }