Wubbable Skrevet 18. mars 2008 Del Skrevet 18. mars 2008 Sitter å river meg i håret pga jeg har en følelse av at det er et dødelig enkelt svar på dette spørsmålet: Jeg har et CLI-program som kjører inni programmet mitt sin console, og skriver en decibel-verdi som jeg vil ha tak i... Så, hvordan leser jeg teksten som står i konsollvinduet til programmet mitt? Lenke til kommentar
j000rn Skrevet 18. mars 2008 Del Skrevet 18. mars 2008 sånn ca.... Process p = new Process(); // System.Diagnostics p.StartInfo.FileName = "decibel.exe"; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.UseShellExecute = false; // eller true? p.Start(); string text = p.StandardOutput.ReadAll(); Lenke til kommentar
Wubbable Skrevet 18. mars 2008 Forfatter Del Skrevet 18. mars 2008 (endret) Har prøvd akkurat det, funker ikke... edit: Og, hvorfor må jeg lese decibel.exe (eksempel) sin stream, finnes det ikke en så grunnleggendes funksjon som å lese konsollen til ditt eget program? Endret 18. mars 2008 av Wubbable Lenke til kommentar
GeirGrusom Skrevet 19. mars 2008 Del Skrevet 19. mars 2008 Man bruker såklart stream til dette, men du burde bruke asynkron lesing istedet for synkron, siden programmet kjører asynkront med ditt eget kan det føre til at du ikke får med deg all informasjon (av en eller annen grunn) Men UseShellExecute skal være false ja. Dette gjøres med BeginOutputReadLine funksjonen. Den leser altså en linje av gangen så lenge programmet kjører. Lenke til kommentar
Wubbable Skrevet 19. mars 2008 Forfatter Del Skrevet 19. mars 2008 (endret) Da står det bare: Cannot mix synchronous and asynchronous operation on process stream. Koden er: Dim P As New Process P.StartInfo.FileName = "C:\normalize.exe" P.StartInfo.Arguments = "-p C:\test.wav" P.StartInfo.RedirectStandardOutput = True P.StartInfo.UseShellExecute = False P.Start() P.BeginOutputReadLine() Dim x As String = Nothing Do While P.StandardOutput.EndOfStream = False x &= P.StandardOutput.ReadLine & Environment.NewLine Loop Endret 19. mars 2008 av Wubbable Lenke til kommentar
GeirGrusom Skrevet 19. mars 2008 Del Skrevet 19. mars 2008 Det er fordi du ikke har lest hvordan BeginOutputReadLine fungerer Lenke til kommentar
Wubbable Skrevet 19. mars 2008 Forfatter Del Skrevet 19. mars 2008 (endret) Leste og prøvde å forstå MSDN eksempelet... Fikk det sånn delvis til, men eventen fyrer bare av når normalize.exe er slutt, og e.Data er tom... Sub Main() Dim P As New Process AddHandler P.OutputDataReceived, AddressOf P_OutputDataReceived P.StartInfo.FileName = "C:\normalize.exe" P.StartInfo.Arguments = "-p C:\test.wav" P.StartInfo.RedirectStandardOutput = True P.StartInfo.RedirectStandardInput = True P.StartInfo.UseShellExecute = False P.Start() P.BeginOutputReadLine() Dim SW As StreamWriter = P.StandardInput SW.WriteLine("n") 'MsgBox(Console.In.ReadLine) <-- kødd :P End Sub Private Sub P_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) MsgBox(e.Data) End Sub edit: Glem det, sjekket kildekoden til normalize.exe (open source), og fant ut at den skrev til stderr (StandardError streamen), så nå funker det perfekt slik: P.StandardError.ReadToEnd() Endret 20. mars 2008 av Wubbable Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå