Gå til innhold

VB console app: Hvordan lese tekst som allerede er i consolen?


Anbefalte innlegg

Skrevet

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?

Videoannonse
Annonse
Skrevet

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();

Skrevet (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? :p

Endret av Wubbable
Skrevet

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.

Skrevet (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 av Wubbable
Skrevet (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 av Wubbable

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...