private static async Task <string[]> ExecuteDirectAsync(string arguments, CancellationToken cancellationToken) { using var canceller = new RedirectionCanceller(); using var proc = new Process { StartInfo = { FileName = Path.Combine(Environment.SystemDirectory, "pnputil.exe"), Arguments = arguments, CreateNoWindow = true, UseShellExecute = false, RedirectStandardInput = false, RedirectStandardOutput = true }, EnableRaisingEvents = true }; var outputLines = new List <string>(); var tcs = new TaskCompletionSource <bool>(); void received(object sender, DataReceivedEventArgs e) => outputLines.Add(e.Data); void exited(object sender, EventArgs e) => tcs.SetResult(true); using var registration = cancellationToken.Register(() => tcs.TrySetCanceled()); try { proc.OutputDataReceived += received; proc.Exited += exited; proc.Start(); proc.BeginOutputReadLine(); await tcs.Task; return(outputLines.ToArray()); } finally { proc.OutputDataReceived -= received; proc.Exited -= exited; } }
private static async Task <string[]> ExecuteCommandLineAsync(string arguments, CancellationToken cancellationToken) { using var canceller = new RedirectionCanceller(); using var proc = new Process { StartInfo = { FileName = Environment.GetEnvironmentVariable("ComSpec"), CreateNoWindow = true, UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true }, EnableRaisingEvents = true }; string[] inputLines = { "chcp 437", // Change code page to 437 (US English). $"pnputil {arguments}", "exit" }; var outputLines = new List <string>(); var tcs = new TaskCompletionSource <bool>(); void received(object sender, DataReceivedEventArgs e) => outputLines.Add(e.Data); void exited(object sender, EventArgs e) => tcs.SetResult(true); using var registration = cancellationToken.Register(() => tcs.TrySetCanceled()); try { proc.OutputDataReceived += received; proc.Exited += exited; proc.Start(); proc.BeginOutputReadLine(); using (var writer = proc.StandardInput) { if (writer.BaseStream.CanWrite) { foreach (var inputLine in inputLines) { writer.WriteLine(inputLine); } } } await tcs.Task; return(outputLines.ToArray()); } finally { proc.OutputDataReceived -= received; proc.Exited -= exited; } }