【问题标题】:Redirect a process's output to both a file and the console将进程的输出重定向到文件和控制台
【发布时间】:2019-05-24 14:34:56
【问题描述】:

我需要从 c# 代码中执行一个 shell 命令,然后将 shell 的输出记录到一个文件中。

我用来执行shell命令的代码是:

using (var process = Process.Start(new ProcessStartInfo
{
    FileName = fileName,
    Arguments = arguments,
    CreateNoWindow = false,
    WindowStyle = ProcessWindowStyle.Normal,
    RedirectStandardOutput = false,
    UseShellExecute = true,
}))
{
    // blocking wait for the process to end
    process.WaitForExit();
}

我阅读了更改 RedirectStandardOutput = true 和 useShellExecute = false 的其他答案,因此他们可以使用控制台输出

string output = process.StandardOutput.ReadToEnd();

但这不会打开 shell 窗口。

有没有办法将命令输出显示到控制台窗口并获取该输出?

【问题讨论】:

  • 看看这个:stackoverflow.com/questions/39358017/…它在过去帮助了我。
  • 进程运行了吗?你得到输出了吗?您将输出重定向到一个文件,因此它不会出现在任何窗口中。这与写dir > list.txt 相同。你不会看到输出,它会全部进入文件
  • 顺便说一句,在RedirectStandardOutputBy setting RedirectStandardOutput to true to redirect the StandardOutput stream, you can manipulate or suppress the output of a process. For example, you can filter the text, format it differently, or write the output to both the console and a designated log file.中有解释
  • 看看这是否有帮助:How do I get output from a command to appear in a control on a Form in real-time?。还有一个示例项目可供您下载并用于测试。
  • 我不想重定向标准输出,而只是接受控制台窗口上打印的命令。只需将控制台上的任何内容放入字符串中即可。

标签: c# .net tee


【解决方案1】:

可以使用类似的东西

using System;
using System.Diagnostics;

    namespace InteractWithConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
                cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
                cmdStartInfo.RedirectStandardOutput = true;
                cmdStartInfo.RedirectStandardError = true;
                cmdStartInfo.RedirectStandardInput = true;
                cmdStartInfo.UseShellExecute = false;
                cmdStartInfo.CreateNoWindow = true;

                Process cmdProcess = new Process();
                cmdProcess.StartInfo = cmdStartInfo;
                cmdProcess.ErrorDataReceived += cmd_Error;
                cmdProcess.OutputDataReceived += cmd_DataReceived;
                cmdProcess.EnableRaisingEvents = true;
                cmdProcess.Start();
                cmdProcess.BeginOutputReadLine();
                cmdProcess.BeginErrorReadLine();

                cmdProcess.StandardInput.WriteLine("ping google.com.ua");     //Execute ping google.com.ua
                cmdProcess.StandardInput.WriteLine("exit");                  //Execute exit.

                cmdProcess.WaitForExit();
            }

            static void cmd_DataReceived(object sender, DataReceivedEventArgs e)
            {
                Console.WriteLine("Output from other process");
                Console.WriteLine(e.Data);
            }

            static void cmd_Error(object sender, DataReceivedEventArgs e)
            {
                Console.WriteLine("Error from other process");
                Console.WriteLine(e.Data);
            }
        }
    }

【讨论】:

  • 基本上这会重定向标准输出,使用文本然后将其打印到控制台。稍加修改,它就可以完美运行。谢谢。
  • 但是这种情况下只有1个控制台窗口;父程序的控制台。如果我们要显示两个子程序控制台怎么办?会变得很混乱吧?父程序可以有两个控制台窗口吗?
  • @pete 这是与其他问题相关的巨大话题。基本上流程只能有一个关联的控制台。但是您的应用程序可以有多个进程和多个控制台,例如codeproject.com/Articles/13368/…
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 2015-10-13
  • 2014-01-09
相关资源
最近更新 更多