【发布时间】:2010-07-22 11:52:52
【问题描述】:
我可以使用process.start() 运行命令行进程。
我可以使用标准输入提供输入。之后,当进程再次要求用户输入时,我的程序如何知道输入并将其传递给该 exe?
【问题讨论】:
-
您可能对this post 感兴趣,其中涵盖了使用 .NET 进程的许多复杂性,尤其是在处理输入和输出方面
标签: c#
我可以使用process.start() 运行命令行进程。
我可以使用标准输入提供输入。之后,当进程再次要求用户输入时,我的程序如何知道输入并将其传递给该 exe?
【问题讨论】:
标签: c#
使用Process.StandardInput 和StreamWriter,有一个example here 听起来与您需要的相似。
Process sortProcess;
sortProcess = new Process();
sortProcess.StartInfo.FileName = "Sort.exe";
// Set UseShellExecute to false for redirection.
sortProcess.StartInfo.UseShellExecute = false;
// Redirect the standard output of the sort command.
// This stream is read asynchronously using an event handler.
sortProcess.StartInfo.RedirectStandardOutput = true;
sortOutput = new StringBuilder("");
// Set our event handler to asynchronously read the sort output.
sortProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
// Redirect standard input as well. This stream
// is used synchronously.
sortProcess.StartInfo.RedirectStandardInput = true;
sortProcess.Start();
// Use a stream writer to synchronously write the sort input.
StreamWriter sortStreamWriter = sortProcess.StandardInput;
// Start the asynchronous read of the sort output stream.
sortProcess.BeginOutputReadLine();
Console.WriteLine("Ready to sort up to 50 lines of text");
String inputText;
int numInputLines = 0;
do
{
Console.WriteLine("Enter a text line (or press the Enter key to stop):");
inputText = Console.ReadLine();
if (!String.IsNullOrEmpty(inputText))
{
numInputLines ++;
sortStreamWriter.WriteLine(inputText);
}
}
希望对你有帮助
【讨论】:
sortProcess.StartInfo.FileName = "cmd.exe"; 可能会成功
如果我理解正确,我认为您应该能够通过使用 RedirectStandardOutput 和 RedirectStandardInput 重定向标准输入/输出来做到这一点。
WinSCP 项目有一个 C# 示例,说明如何使用这种方式与之通信。你可以在这里找到它:SFTP file transfers in .NET(虽然这个示例只收集了输出,根本没有使用它,但技术应该是一样的。)
【讨论】:
您要查找 IPC。正如上面的 robert 所示,.NET 中的 Process 类将为您提供帮助。但专门针对您的问题(如何知道何时写入数据):您不能。不是通用的。
如果您知道所需的输入(例如“yyy”),您可以在创建的进程的STDIN 中提供它。您不必等待程序请求此信息:它会在需要数据时从STDIN 读取。
如果您需要处理程序输出来决定写入STDIN 的内容,请尝试读取进程STDOUT。不过,您可能会遇到冲洗问题...
【讨论】: