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