Gå til innhold

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


Anbefalte innlegg

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
Videoannonse
Annonse

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

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

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
Lenke til kommentar

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
Lenke til kommentar

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å
×
×
  • Opprett ny...