批处理文件 - 从 C# 中的命令行调用中获取标准输出

本文关键字:调用 获取 标准输出 命令行 批处理文件 | 更新日期: 2023-09-27 17:57:06

现在,当我通过 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
}

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

批处理文件 - 从 C# 中的命令行调用中获取标准输出

不能直接将命令作为参数传递。

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

您需要将 start 参数编写为 /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

将方法附加到输出数据接收事件。

 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);
 }

您显示的代码无法编译(缺少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# 程序能够捕获输出并对其进行处理。