我正在构建一个小型控制台应用程序,有时会使用Windows命令行,发送命令然后接收并显示输出。
打开一个新的命令行实例很简单,从我的应用程序发送命令需要一些挖掘,但它的工作。但是我似乎无法从命令行读取输出。
我的代码基于:
How to redirect Standard Input/Output of an application
How do I run Command line commands from code
我使用相同的方式将输出读取到我的应用程序,它不起作用,直到我关闭我的应用程序的那一刻,在关闭时我能够看到输出。
它的工作,但很可能是我放错了代码,阻止我看到输出,直到我开始关闭我的应用程序。
有人可以帮我吗?
代码:
Process p = new Process();
p.StartInfo.FileName = Environment.GetEnvironmentVariable("comspec");
p.StartInfo.ErrorDialog = false;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
//Execute the process
if (p.Start())
{
//Get the output stream
StreamReader outputReader = p.StandardOutput;
StreamReader errorReader = p.StandardError;
// Assign a Stream Writer to send the Commands
StreamWriter commandWriter = p.StandardInput;
// Send the "Dir" command to the command line instance.
commandWriter.Write("dir");
commandWriter.Write(commandWriter.NewLine);
p.WaitForExit();
//Display the result
Console.WriteLine(outputReader.ReadToEnd());
outputReader.Close();
errorReader.Close();
commandWriter.Close();
}
答案 0 :(得分:4)
问题是你没有告诉cmd.exe退出。完成后只需发送“exit \ r \ n”。
您最终遇到的另一个问题是您需要异步读取stdout和stdin。
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Process p = new Process();
p.StartInfo.FileName = Environment.GetEnvironmentVariable("comspec");
p.StartInfo.ErrorDialog = false;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
// Hook up async stdout and stderr reading
p.ErrorDataReceived += ConsoleDataReceived;
p.OutputDataReceived += ConsoleDataReceived;
// Execute the process
if (p.Start())
{
// Begin async stdout and stderr reading
p.BeginOutputReadLine();
p.BeginErrorReadLine();
// Send the "Dir" command to the command line instance.
p.StandardInput.WriteLine("dir");
// Send "exit" and wait for exit
p.StandardInput.WriteLine("exit");
p.WaitForExit();
}
}
static void ConsoleDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
Console.WriteLine(e.Data);
}
}