从c#命令行调用中获取标准输出?

时间:2016-07-15 21:21:54

标签: c# batch-file process stdout streamreader

现在,当我通过C#将命令传递给批处理shell(.bat文件)时,我正试图获得标准。我可以在cmd提示启动时获得初始标准(打开时说“Hello World”之类的东西),但是如果我给它一个像“ping 127.0.0.1”这样的参数,我就无法得到输出。到目前为止,我尝试了两种捕获输出的方法。该过程的开始保持不变。

private void testShell(string command)
{
    ProcessStartInfo pi = ProcessStartInfo(*batch shell path*, command);
    pi.CreateNoWindow = true;
    pi.UseShellExecute = false;
    pi.RedirectStandardOutput = true;
    pi.RedirectStandardInput = true;

    Process pr = Process.Start(pi);
//option 1
    while(!pr.StandardOutput.EndOfStream)
    {
        //do something with the line
    }
//option 2
    string str = "";
    using (System.IO.StreamReader output = pr.StandardOutput)
    {
        str = output.ReadToEnd();
    }
//option 3
    string output = pr.StandardOutput.ReadToEnd();
    //do something with the output
}

是否可以将参数传递给批处理文件(这似乎是实际问题)?

3 个答案:

答案 0 :(得分:0)

将一个方法附加到outputdatareceived事件。

 pi.OutputDataReceived += (objectsender,DataReceivedEventArgs  e) => datareceivedtwritetolog(sender, e);

然后创建一个方法来对输出做一些事情:

 public static void datareceivedtwritetolog(object sender, DataReceivedEventArgs e)
 {
     string logpath = @"c:\log-" + DateTime.Now.ToString("MMddyy") + ".txt";
     File.AppendAllText(logpath, e.Data + Environment.NewLine);
 }

答案 1 :(得分:0)

您无法直接将命令作为参数传递。

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/C      Carries out the command specified by string and then terminates
/K      Carries out the command specified by string but remains

您需要将起始参数写为/c ping 127.0.0.1或:

ProcessStartInfo pi = ProcessStartInfo(*batch shell path *, "/c " + command);

注意:如果启动进程文件是批处理文件(* .bat)而不是shell控制台(“cmd”)

,则会中断

或者,您可以将命令写入标准输入:

pr.StandardInput.WriteLine(command);
// do stuffs with pr.StandardOutput

答案 2 :(得分:0)

您展示的代码将无法编译(它缺少new指令)。无论如何,您未显示的批处理文件的某些特定内容可能会失败。以下内容适用:

使用以下内容创建名为Example.cs的文件:

using System;
using System.Diagnostics;

namespace Example
{
    class ExampleClass
    {
        static void Main()
        {
            ProcessStartInfo pi = new ProcessStartInfo("ExampleBatch.cmd", "a b c d");
            pi.CreateNoWindow = true;
            pi.UseShellExecute = false;
            pi.RedirectStandardOutput = true;
            pi.RedirectStandardInput = true;

            Process pr = Process.Start(pi);
            string output = pr.StandardOutput.ReadToEnd();

            Console.WriteLine("--------------------");
            Console.WriteLine("[" + output.ToUpper() + "]");
            Console.WriteLine("--------------------");
        }
    }
}

然后创建一个名为ExampleBatch.cmd的文件,其中包含以下内容:

@echo off
echo This is from the example.
echo Param 1: [%1]
echo Param 2: [%2]
echo Param 3: [%3]
echo Param 4: [%4]
echo Param 5: [%5]

然后使用csc Example.cs编译.cs文件。最后,运行Example.exe将显示以下输出:

--------------------
[THIS IS FROM THE EXAMPLE.
PARAM 1: [A]
PARAM 2: [B]
PARAM 3: [C]
PARAM 4: [D]
PARAM 5: []
]
--------------------

这表明批处理文件能够捕获命令行参数,C#程序能够捕获输出并对其进行处理。