Przechodzenie bezpośrednio przez wyjście konsoli z Process.Start bezpośrednio
używamProcess.Start
z aplikacji wiersza polecenia .NET do uruchomienia innej aplikacji wiersza polecenia. Nie chcę przechwytywać danych wyjściowych aplikacji, chcę po prostu przejść bezpośrednio do konsoli.
Z programem poniżej wynik wydaje się po prostu znikać w powietrzu. Jeśli wyjdęCreateNoWindow
domyślniefalse
następnie otrzymuję dane wyjściowe w nowym oknie konsoli, ale chcę je wyświetlić w oryginalnym oknie konsoli.UseShellExecute <- false
jest również potrzebne w inny sposóbCreateNoWindow
jest zmuszonyfalse
.
Mogłabym zrobić coś znacznie bardziej skomplikowanegoRedirectStandardOutput
iRedirectStandardError
a następnie przechwytywanie danych wyjściowych i ponowne drukowanie, ale w połączeniu zWaitForExit
, szczególnie jak w mojej prawdziwej aplikacji, której chcę użyćwersja, która ma limit czasu.
Czy w jakiś sposób mogę po prostu uzyskać standardowe wyjście i błąd przekazywane bezpośrednio?
Zachowanie, które widzę, jest mylące, ponieważ dokumentacja dlaRedirectStandardOutput
wydaje się wyraźnie mówić:
Gdy proces zapisuje tekst do standardowego strumienia, tekst ten jest zazwyczaj wyświetlany na konsoli.
Oto kod demonstracyjny. Kiedy go uruchomięDummyRunner.exe
Otrzymuję dane wyjściowe z pierwszego bitu kodu i kiedy go uruchomięDummyRunner.exe DummyRunner.exe
Nic nie dostaję. Chociaż kod znajduje się w F #, nie ma nic szczególnego dla tego problemu, który znam.
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