在新控制台中运行命令并在C#中捕获输出

时间:2017-07-24 17:21:42

标签: c#

我已经阅读了很多关于从C#中捕获命令输出的问题,但它们都使用StartInfo.UseShellExecute = false属性来重定向输出。但这对我不起作用,因为我仍然希望控制台窗口在那里打开输出显示。

这允许我将输出捕获到文件,但不显示控制台。

using System.Diagnostics;

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.Arguments = "/C ping 8.8.8.8 -t";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.CreateNoWindow = true;
cmd.Start();
cmd.BeginOutputReadLine();
.
.
.

这会显示控制台,但不允许我捕获输出。

using System.Diagnostics;

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.Arguments = "/C ping 8.8.8.8 -t";
cmd.Start();
.
.
.

我的目标是启动多个命令窗口,每个窗口都运行一个给定的命令。但是,我还希望将控制台输出保存到日志文件中。每个命令窗口一个日志文件。启动命令窗口并让它们使用自己的STDOUT运行,或者将输出重定向到文件是微不足道的。但我怎么能两个都做?

我甚至试图重定向输出并启动我自己的WinForms看起来像控制台来显示输出,但是因为每个都在一个单独的进程中而无法写入GUI线程而被停止。 / p>

1 个答案:

答案 0 :(得分:0)

好吧,对于类似“ping'命令,不需要cmd窗口,可以从c#本身完成。以下是代码:

using System.Net.NetworkInformation; //required for ping

Console.Write("Address to ping: ");
string nameOrAddress = Console.ReadLine();
bool pingable = false;
Ping pinger = new Ping();

try
{
    PingReply reply = pinger.Send(nameOrAddress);
    pingable = reply.Status == IPStatus.Success;

    if(pingable == true) 
    {
        Console.WriteLine("Connected successfully");
    }
    else if(pingable == false) 
    {
        Console.WriteLine("Unable to connect");
    }
}
catch (PingException)
{
    Console.WriteLine("Unknown Error. Try again. Maybe an incorrect address");
}