【问题标题】:How do I interact with prompts using C# System.Diagnostics.Process?如何使用 C# System.Diagnostics.Process 与提示交互?
【发布时间】:2010-01-13 00:12:12
【问题描述】:

我正在通过 C# System.Diagnostics.Process 运行命令行进程。

当我在 cmd.exe 中输入相同的命令时,它会立即提示我输入密码。在我输入密码后,该过程继续完成。

但是,使用 System.Diagnotic.Process,我重定向的标准输出都不会产生密码提示。如果是这样,我将使用重定向的标准输入的 WriteLine 方法以编程方式输入它。

在使用 Process 对象的输出中通常看不到提示吗?提示是否与其他标准输出行不同?如果是这样,如何将“提示事件”带入我的应用程序,输入输入,然后让进程以与 cmd.exe 中相同的方式进行?

【问题讨论】:

    标签: c# process


    【解决方案1】:

    当您重定向用 C/C++ 编写的程序的输出时,stdout 流切换到缓冲模式。提示就在那里,它只是从未从内部缓冲区刷新到流,因为缓冲区没有被填满。只需输入密码就可能解决您的问题。

    【讨论】:

    • 大多数命令行程序都会在 stderr 流上提示输入密码,不是吗?
    • 我尝试过使用 Process.StandardInput.WriteLine("password"),但由于我没有输入密码,进程只是挂起。第一个人提到我必须制作重定向流。如果是这样,为什么调用此方法不会导致异常。它的行为就像它已经有一个输入流作为流程对象的属性。
    • Daniel,当相应事件发生时,我将错误输出和常规输出添加到文本框。然而,在 cmd.exe 中执行完全相同的命令时,我看不到提示
    • 我肯定会得到标准输出和错误,但从未显示提示。你们中是否有人使用 System.Diagnostics.Process 对象实际与提示进行过交互?
    • 是的,cmd.exe 也不起作用。但是不,我可能没有尝试过你的程序,不管它是什么。
    【解决方案2】:

    在为您的Process.Start 调用准备ProcessStartInfo 时,请务必正确设置以下属性:

    1. RedirectStandardInput
    2. RedirectStandardOutput
    3. RedirectStandardError

    在创建 Process 对象后,请确保为适当的重定向流使用以下属性:

    1. StandardInput
    2. StandardOutput
    3. StandardError

    【讨论】:

    • 您无法设置这些属性,因为它们是只读的......但是,您可以读取/写入这些属性返回的流
    • StartInfo 对象的 RedirectStandardInput、RedirectStandardOutput 和 RedirectStandardError 均已设置为 true,您正在尝试确认。
    • 但是,我已经通过两个单独的 DataRecievedEventHandler 对象成功地从 OutputDataReceived 和 ErrorDataReceived 事件中获取输出和错误,这些对象调用将它们输出到文本框的自定义方法(没有显式创建任何流)。
    • 我没有创建任何重定向流,因为它们似乎是内置的。我已经确认每次发生错误或输出时事件都会接收数据并将数据传递给我的自定义方法。但是,这些是否会由于某种原因不输出“提示输出”?至于写输入,为什么要创建重定向流。当 RedirectStandardInput 等于 true 时,Process.StandardInput.WriteLine("password") 输入不就够了吗?
    • 我很难从概念上理解流程对象,如果它需要您创建这些流,因为许多方法和事件暗示这些东西是完全抽象的。
    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 2021-03-23
    • 2015-05-25
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多