.net 通过进程的控制台输出。直接启动

.net 通过进程的控制台输出。直接启动,.net,f#,.net,F#,我正在使用.NET命令行应用程序中的来运行另一个命令行应用程序。我不想捕获应用程序的输出,我只想让它直接进入控制台 有了下面的程序,输出似乎就消失得无影无踪了。如果我保留默认值false,那么我确实会在新的控制台窗口中获得输出,但我希望它在原始控制台窗口中。也需要,否则CreateNoWindow将被迫false 我可以使用并捕获输出并重新打印它来做一些更复杂的事情,但这需要巧妙地结合,特别是在我想要使用的实际应用程序中 有没有什么方法可以直接传递标准输出和错误 我看到的行为令人困惑,因为Red

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

有了下面的程序,输出似乎就消失得无影无踪了。如果我保留默认值
false
,那么我确实会在新的控制台窗口中获得输出,但我希望它在原始控制台窗口中。也需要,否则
CreateNoWindow
将被迫
false

我可以使用并捕获输出并重新打印它来做一些更复杂的事情,但这需要巧妙地结合,特别是在我想要使用的实际应用程序中

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

我看到的行为令人困惑,因为
RedirectStandardOutput
的文档似乎明确指出:

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

这是演示代码。当我用
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
模块DummyRunner
开放系统
开放系统诊断
[]
让主参数=
//在没有参数的情况下进行调用,这样我们就可以调用
//这本身就是一个自足测试的论据
如果args.Length=0,则
对于n=1到5 do
打印fn“正在等待%d”n
系统线程线程睡眠(1000)
System.Environment.Exit(0)
设cmd=args。[0]
让cmdArgs=args。[1..]
让startInfo=ProcessStartInfo(cmd,String.Join(“,cmdArgs))

startInfo.UseShellExecute您实际上并没有读取流程的标准输出。重定向标准输出会将输出添加到流程标准输出,但不会将其读入正在运行的流程

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
让startInfo=ProcessStartInfo(cmd,String.Join(“,cmdArgs))

startInfo.UseShellExecute我不想读取标准输出,我只想让它直接进入控制台。上面的更改将一个进程的std输出传输到另一个进程的std输出,是的,从技术上讲,它确实将一个进程的输出读取到另一个进程,但我不完全确定两个进程是否可以共享同一个std输出流,而不从一个进程读取到另一个进程。可能有一种方法可以在内部实现这一点,但我怀疑进一步的研究会发现,为了避免死锁,可以采用相同的方法来实现读取异步,然后,如果等待退出超时,异步调用仍然返回…我还需要交替读取标准错误-我不能同时在两个流上使用
ReadToEnd
,除非我使用多个线程。我相信我可以这样做,但它看起来相当复杂。我给你的链接中提到的BeginOutputReadLine方法是对被调用进程的std输出流的异步读取,你是对的,你不能对两者都使用同步读取,但你肯定可以使用异步读取