private static int InternalExecWaitWithCapture(string cmd, string currentDir, TempFileCollection tempFiles, ref string outputName, ref string errorName) { if ((cmd == null) || (cmd.Length == 0)) { throw new ExternalException(Locale.GetText("No command provided for execution.")); } if (outputName == null) { outputName = tempFiles.AddExtension("out"); } if (errorName == null) { errorName = tempFiles.AddExtension("err"); } int exit_code = -1; Process proc = new Process(); proc.StartInfo.FileName = cmd; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.WorkingDirectory = currentDir; try { proc.Start(); ProcessResultReader outReader = new ProcessResultReader(proc.StandardOutput, outputName); ProcessResultReader errReader = new ProcessResultReader(proc.StandardError, errorName); Thread t = new Thread(new ThreadStart(errReader.Read)); t.Start(); outReader.Read(); t.Join(); proc.WaitForExit(); } finally { exit_code = proc.ExitCode; // the handle is cleared in Close (so no ExitCode) proc.Close(); } return(exit_code); }
private static int InternalExecWaitWithCapture (string cmd, string currentDir, TempFileCollection tempFiles, ref string outputName, ref string errorName) { if ((cmd == null) || (cmd.Length == 0)) throw new ExternalException (Locale.GetText ("No command provided for execution.")); if (outputName == null) outputName = tempFiles.AddExtension ("out"); if (errorName == null) errorName = tempFiles.AddExtension ("err"); int exit_code = -1; Process proc = new Process (); proc.StartInfo.FileName = cmd; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.WorkingDirectory = currentDir; try { proc.Start(); ProcessResultReader outReader = new ProcessResultReader (proc.StandardOutput, outputName); ProcessResultReader errReader = new ProcessResultReader (proc.StandardError, errorName); Thread t = new Thread (new ThreadStart (errReader.Read)); t.Start (); outReader.Read (); t.Join (); proc.WaitForExit(); } finally { exit_code = proc.ExitCode; // the handle is cleared in Close (so no ExitCode) proc.Close (); } return exit_code; }