将输出重定向到文本文件c#

这是我的代码:

Process pr2 = new Process(); pr2.StartInfo.FileName = "show-snps"; pr2.StartInfo.Arguments = @"-Clr -x 2 out.delta > out.snps"; pr2.Start(); pr2.WaitForExit(); 

show-snps写错误。 当我删除部分“> out.snps”时,一切正常,它将结果写入终端,但我需要将其重定向到文本文件。 我怎样才能做到这一点?

当你启动这样的程序时,你不能像那样重定向。 它需要一个像CMD.EXE这样的shell来做到这一点。

相反,您需要将ProcessStartInfo.RedirectStandardOutput设置为您自己管理的流。

这里有一个例子 。

该示例显示了如何通过StreamReader获取控制台进程创建的数据。 根据您的要求,您将从该StreamReader读取并写入FileStream输出。

如果它有任何帮助,这里是我多年前写的一个实用工具类(for .Net 2),这可能是有益的:

 using System; using System.IO; using System.Threading; using System.Diagnostics; using System.Collections; using System.Collections.Specialized; namespace ProcessUtilities { ///  /// Encapsulates an executable program. /// This class makes it easy to run a console app and have that app's output appear /// in the parent console's window, and to redirect input and output from/to files. ///  ///  /// To use this class: /// (1) Create an instance. /// (2) Set the ProgramFileName property if a filename wasn't specified in the constructor. /// (3) Set other properties if required. /// (4) Call Run(). ///  public class Executable { #region Constructor /// Runs the specified program file name. /// Name of the program file to run. public Executable(string programFileName) { ProgramFileName = programFileName; _processStartInfo.ErrorDialog = false; _processStartInfo.CreateNoWindow = false; _processStartInfo.UseShellExecute = false; _processStartInfo.RedirectStandardOutput = false; _processStartInfo.RedirectStandardError = false; _processStartInfo.RedirectStandardInput = false; _processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; _processStartInfo.Arguments = ""; } /// Constructor. public Executable(): this(string.Empty) { } #endregion // Constructor #region Public Properties /// The filename (full pathname) of the executable. public string ProgramFileName { get { return _processStartInfo.FileName; } set { _processStartInfo.FileName = value; } } /// The command-line arguments passed to the executable when run.  public string Arguments { get { return _processStartInfo.Arguments; } set { _processStartInfo.Arguments = value; } } /// The working directory set for the executable when run. public string WorkingDirectory { get { return _processStartInfo.WorkingDirectory; } set { _processStartInfo.WorkingDirectory = value; } } ///  /// The file to be used if standard input is redirected, /// or null or string.Empty to not redirect standard input. ///  public string StandardInputFileName { set { _standardInputFileName = value; _processStartInfo.RedirectStandardInput = !string.IsNullOrEmpty(value); } get { return _standardInputFileName; } } ///  /// The file to be used if standard output is redirected, /// or null or string.Empty to not redirect standard output. ///  public string StandardOutputFileName { set { _standardOutputFileName = value; _processStartInfo.RedirectStandardOutput = !string.IsNullOrEmpty(value); } get { return _standardOutputFileName; } } ///  /// The file to be used if standard error is redirected, /// or null or string.Empty to not redirect standard error. ///  public string StandardErrorFileName { set { _standardErrorFileName = value; _processStartInfo.RedirectStandardError = !string.IsNullOrEmpty(value); } get { return _standardErrorFileName; } } #endregion // Public Properties #region Public Methods /// Add a set of name-value pairs into the set of environment variables available to the executable. /// The name-value pairs to add. public void AddEnvironmentVariables(StringDictionary variables) { if (variables == null) throw new ArgumentNullException("variables"); StringDictionary environmentVariables = _processStartInfo.EnvironmentVariables; foreach (DictionaryEntry e in variables) environmentVariables[(string)e.Key] = (string)e.Value; } /// Run the executable and wait until the it has terminated. /// The exit code returned from the executable. public int Run() { Thread standardInputThread = null; Thread standardOutputThread = null; Thread standardErrorThread = null; _standardInput = null; _standardError = null; _standardOutput = null; int exitCode = -1; try { using (Process process = new Process()) { process.StartInfo = _processStartInfo; process.Start(); if (process.StartInfo.RedirectStandardInput) { _standardInput = process.StandardInput; standardInputThread = startThread(new ThreadStart(supplyStandardInput), "StandardInput"); } if (process.StartInfo.RedirectStandardError) { _standardError = process.StandardError; standardErrorThread = startThread(new ThreadStart(writeStandardError), "StandardError"); } if (process.StartInfo.RedirectStandardOutput) { _standardOutput = process.StandardOutput; standardOutputThread = startThread(new ThreadStart(writeStandardOutput), "StandardOutput"); } process.WaitForExit(); exitCode = process.ExitCode; } } finally // Ensure that the threads do not persist beyond the process being run { if (standardInputThread != null) standardInputThread.Join(); if (standardOutputThread != null) standardOutputThread.Join(); if (standardErrorThread != null) standardErrorThread.Join(); } return exitCode; } #endregion // Public Methods #region Private Methods /// Start a thread. /// start information for this thread /// name of the thread /// thread object private static Thread startThread(ThreadStart startInfo, string name) { Thread t = new Thread(startInfo); t.IsBackground = true ; t.Name = name; t.Start(); return t; } /// Thread which supplies standard input from the appropriate file to the running executable. private void supplyStandardInput() { // feed text from the file a line at a time into the standard input stream using (StreamReader reader = File.OpenText(_standardInputFileName)) using (StreamWriter writer = _standardInput) { writer.AutoFlush = true; for (;;) { string textLine = reader.ReadLine(); if (textLine == null) break; writer.WriteLine(textLine); } } } /// Thread which outputs standard output from the running executable to the appropriate file. private void writeStandardOutput() { using (StreamWriter writer = File.CreateText(_standardOutputFileName)) using (StreamReader reader = _standardOutput) { writer.AutoFlush = true; for (;;) { string textLine = reader.ReadLine(); if (textLine == null) break; writer.WriteLine(textLine); } } if (File.Exists(_standardOutputFileName)) { FileInfo info = new FileInfo(_standardOutputFileName); // if the error info is empty or just contains eof etc. if (info.Length < 4) info.Delete(); } } /// Thread which outputs standard error output from the running executable to the appropriate file. private void writeStandardError() { using (StreamWriter writer = File.CreateText(_standardErrorFileName)) using (StreamReader reader = _standardError) { writer.AutoFlush = true; for (;;) { string textLine = reader.ReadLine(); if (textLine == null) break; writer.WriteLine(textLine); } } if (File.Exists(_standardErrorFileName)) { FileInfo info = new FileInfo(_standardErrorFileName); // if the error info is empty or just contains eof etc. if (info.Length < 4) info.Delete(); } } #endregion // Private Methods #region Private Fields private StreamReader _standardError ; private StreamReader _standardOutput ; private StreamWriter _standardInput ; private string _standardInputFileName; private string _standardOutputFileName; private string _standardErrorFileName; ProcessStartInfo _processStartInfo = new ProcessStartInfo(); #endregion // Private Fields } } 

它不起作用,因为cmd.exe shell支持>重定向。 请尝试使用以下代码。

 Process pr2 = new Process(); pr2.StartInfo.FileName = @"c:\windows\system32\cmd.exe"; pr2.StartInfo.Arguments = @"/k \"show-snps -Clr -x 2 out.delta > out.snps\""; pr2.Start(); pr2.WaitForExit();