现在,当我通过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
}
是否可以将参数传递给批处理文件(这似乎是实际问题)?
答案 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#程序能够捕获输出并对其进行处理。