控制台应用程序提示输入

时间:2009-11-05 21:03:37

标签: c# scripting process console

我正在尝试使用StandardInput和StandardOutput将控制器应用程序的包装器组合在一起。我遇到了控制台应用程序提示输入密码等问题。

我想从StandardOutput读取,提示用户使用读取文本,并使用StandardInput将用户输入写回控制台应用程序。看起来很简单,这就是我目前所拥有的:

Process process = new Process()
{
    StartInfo =
    {
        FileName = "bin\\vpnc.exe",
        Arguments = "--no-detach --debug 0",
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
    }
};

process.OutputDataReceived += (s, args) => 
{
    textBlock1.Dispatcher.Invoke(new Action(() =>
    {
        textBlock1.Text += args.Data;
    }));
};
process.Start();
process.BeginOutputReadLine();

问题在于BeginOutputReadLine()正在做......正在等待行结束。在这种情况下,它只是坐着,坐着,坐着因为没有要读取的行......控制台应用程序写出了没有行结束的文本并且正在等待输入。 巧合的是,当我手动杀死进程时,事件会触发,我会收到文本。

有没有办法告诉进程正在等待StandardInput?或者我错过了一个完全明显的方法来实现目标?

4 个答案:

答案 0 :(得分:1)

process.StandardOutput.BaseStream.BeginRead(...)是你的readline的潜在替代品,并且不会等待一行结束但是你需要知道什么终止输出以确定什么时候不启动等待下一个数据块

答案 1 :(得分:1)

除非您需要异步,否则您可能需要ReadToEnd

以下是所有StreamReader Methods

的列表

答案 2 :(得分:0)

正如Rune所说,您可以直接访问进程的输出流(process.StandardOutput)并从那里读取(如果您不想等到在控制台应用程序中输入换行符),意味着您需要定期检查新数据。

要与应用程序交互,您只需写入进程的StandardInput(创建一个写入process.StandardInput的StreamWriter)。

在MSDN文档(http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx)上写了一个很好的写入示例。

希望这有帮助

答案 3 :(得分:0)

您需要使用同步读取方法并自行处理任何必要的线程。下面的代码不会告诉您输入是预期的,但您将能够检测到显示提示。

        char[] b = new char[1024];
        while (!process.HasExited) {
            int c = process.StandardOutput.Read(b, 0, b.Length);
            context.Response.Write(b, 0, c);
            Thread.Sleep(100);
        }