批处理文件 - 从 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
}
是否可以将参数传递给批处理文件(这似乎是实际问题)?
不能直接将命令作为参数传递。
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# 程序能够捕获输出并对其进行处理。