我正在使用.NET命令行应用程序中的Process.Start
来运行另一个命令行应用程序。我不想捕获应用程序的输出,我只是希望它直接进入控制台。
随着下面的程序输出似乎只是消失在空气中。如果我将CreateNoWindow
保留为默认false
,那么我会在新的控制台窗口中获取输出,但我希望它在原始控制台窗口中。还需要UseShellExecute <- false
,否则CreateNoWindow
被迫false
。
我可以使用RedirectStandardOutput
和RedirectStandardError
执行更复杂的操作然后捕获输出并重新打印它,但这与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
答案 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
这应该将正在运行的进程的输出转发到父运行的线程。有关详细信息,请参阅此页。