小古Blog
执行cmd并返回程序结果
2012-8-5 小古

// Define the namespaces used by this sample.

using System;

using System.Text;

using System.Globalization;

using System.IO;

using System.Diagnostics;

using System.Threading;

using System.ComponentModel;


namespace ProcessAsyncStreamSamples

{

    class ProcessNetStreamRedirection

    {

        // Define static variables shared by class methods.

        private static StreamWriter streamError =null;

        private static String netErrorFile = "";

        private static StringBuilder netOutput = null;

        private static bool errorRedirect = false;

        private static bool errorsWritten = false;


        public static void RedirectNetCommandStreams()

        {

            String netArguments;

            Process netProcess;


            // Get the input computer name.

            Console.WriteLine("Enter the computer name for the net view command:");

            netArguments = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture);

            if (String.IsNullOrEmpty(netArguments))

            {

                // Default to the help command if there is not an input argument.

                netArguments = "/?";

            }


            // Check if errors should be redirected to a file.

            errorsWritten = false;

            Console.WriteLine("Enter a fully qualified path to an error log file");

            Console.WriteLine("  or just press Enter to write errors to console:");

            netErrorFile = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture);

            if (!String.IsNullOrEmpty(netErrorFile))

            {

                errorRedirect = true;

            }


            // Note that at this point, netArguments and netErrorFile

            // are set with user input.  If the user did not specify

            // an error file, then errorRedirect is set to false.


            // Initialize the process and its StartInfo properties.

            netProcess = new Process();

            netProcess.StartInfo.FileName = "Net.exe";


            // Build the net command argument list.

            netProcess.StartInfo.Arguments = String.Format("view {0}", netArguments);


            // Set UseShellExecute to false for redirection.

            netProcess.StartInfo.UseShellExecute = false;


            // Redirect the standard output of the net command. 

            // This stream is read asynchronously using an event handler.

            netProcess.StartInfo.RedirectStandardOutput = true;

            netProcess.OutputDataReceived += new DataReceivedEventHandler(NetOutputDataHandler);

            netOutput = new StringBuilder();


            if (errorRedirect)

            {

                // Redirect the error output of the net command.

                netProcess.StartInfo.RedirectStandardError = true;

                netProcess.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler);

            }

            else

            {

                // Do not redirect the error output.

                netProcess.StartInfo.RedirectStandardError = false;

            }


            Console.WriteLine("\nStarting process: net {0}", netProcess.StartInfo.Arguments);

            if (errorRedirect)

            {

                Console.WriteLine("Errors will be written to the file {0}", netErrorFile);

            }


            // Start the process.

            netProcess.Start();


            // Start the asynchronous read of the standard output stream.

            netProcess.BeginOutputReadLine();


            if (errorRedirect)

            {

                // Start the asynchronous read of the standard

                // error stream.

                netProcess.BeginErrorReadLine();

            }


            // Let the net command run, collecting the output.

            netProcess.WaitForExit();


            if (streamError != null)

            {

                // Close the error file.

                streamError.Close();

            }

            else

            {

                // Set errorsWritten to false if the stream is not

                // open.   Either there are no errors, or the error

                // file could not be opened.

                errorsWritten = false;

            }


            if (netOutput.Length > 0)

            {

                // If the process wrote more than just

                // white space, write the output to the console.

                Console.WriteLine("\nPublic network shares from net view:\n{0}\n", netOutput);

            }


            if (errorsWritten)

            {

                // Signal that the error file had something

                // written to it.

                String [] errorOutput = File.ReadAllLines(netErrorFile);

                if (errorOutput.Length > 0)

                {

                    Console.WriteLine("\nThe following error output was appended to {0}.",netErrorFile);

                    foreach (String errLine in errorOutput)

                    {

                        Console.WriteLine("  {0}", errLine);

                    }

                }

                Console.WriteLine();

            }

            netProcess.Close();

        }


        private static void NetOutputDataHandler(object sendingProcess, DataReceivedEventArgs outLine)

        {

            // Collect the net view command output.

            if (!String.IsNullOrEmpty(outLine.Data))

            {

                // Add the text to the collected output.

                netOutput.Append(Environment.NewLine + "  " + outLine.Data);

            }

        }


        private static void NetErrorDataHandler(object sendingProcess, DataReceivedEventArgs errLine)

        {

            // Write the error text to the file if there is something

            // to write and an error file has been specified.


            if (!String.IsNullOrEmpty(errLine.Data))

            {

                if (!errorsWritten)

                {

                    if (streamError == null)

                    {

                        // Open the file.

                        try

                        {

                            streamError = new StreamWriter(netErrorFile, true);

                        }

                        catch (Exception e)

                        {

                            Console.WriteLine("Could not open error file!");

                            Console.WriteLine(e.Message.ToString());

                        }

                    }


                    if (streamError != null)

                    {

                        // Write a header to the file if this is the first

                        // call to the error output handler.

                        streamError.WriteLine();

                        streamError.WriteLine(DateTime.Now.ToString());

                        streamError.WriteLine("Net View error output:");

                    }

                    errorsWritten = true;

                }


                if (streamError != null)

                {

                    // Write redirected errors to the file.

                    streamError.WriteLine(errLine.Data);

                    streamError.Flush();

                }

            }

        }

    }

}

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容