Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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;
            }
        }