直接从Process.Start传递控制台输出

时间:2014-01-26 17:46:30

标签: .net f#

我正在使用.NET命令行应用程序中的Process.Start来运行另一个命令行应用程序。我不想捕获应用程序的输出,我只是希望它直接进入控制台。

随着下面的程序输出似乎只是消失在空气中。如果我将CreateNoWindow保留为默认false,那么我会在新的控制台窗口中获取输出,但我希望它在原始控制台窗口中。还需要UseShellExecute <- false,否则CreateNoWindow被迫false

我可以使用RedirectStandardOutputRedirectStandardError执行更复杂的操作然后捕获输出并重新打印它,但这与WaitForExit结合使用,特别是在我的情况下真正的应用程序我想使用the version that has a timeout

有什么方法可以直接获得标准输出和错误传递?

我看到的行为令人困惑,因为RedirectStandardOutput的文档确实似乎清楚地说明了:

  

当Process将文本写入其标准流时,该文本通常显示在控制台上。

这是演示代码。当我用DummyRunner.exe运行它时,我从第一位代码获得输出,当我用DummyRunner.exe DummyRunner.exe运行时,我什么也得不到。虽然代码在F#中,但我并不特别关注这个问题的F#。

module DummyRunner

open System
open System.Diagnostics

[<EntryPoint>]
let main args =

    // do something when called with no arguments, just so we can call
    // this with itself as an argument to make a self-contained test
    if args.Length = 0 then
        for n = 1 to 5 do
            printfn "Waiting %d" n
            System.Threading.Thread.Sleep(1000)
        System.Environment.Exit(0)

    let cmd = args.[0]
    let cmdArgs = args.[1..]

    let startInfo = ProcessStartInfo(cmd, String.Join(" ", cmdArgs))

    startInfo.UseShellExecute <- false
    startInfo.CreateNoWindow <- true

    let p = Process.Start(startInfo)

    p.WaitForExit()
    p.ExitCode

1 个答案:

答案 0 :(得分:1)

您实际上并未阅读流程的标准输出。重定向标准输出会将输出添加到过程标准输出,但不会将其读入正在运行的过程。

let startInfo = ProcessStartInfo(cmd, String.Join(" ", cmdArgs))

startInfo.UseShellExecute <- false
startInfo.RedirectStandardOutput <- true;
let p = Process.Start(startInfo)

printfn p.StandardOutput.ReadToEnd();
p.WaitForExit()
p.ExitCode

这应该将正在运行的进程的输出转发到父运行的线程。有关详细信息,请参阅此页。

redirect std output