Question

Redirect console output in realtime (RedirectStandardError)

Asked by: narmi2

Dear Experts,

I am trying to redirect the output of of cmd in realtime to a textbox on my winform.  So far I have the code below, which displays the cmd output once the cmd process has finished.  How do I modify this code so it happens in real time?

Option Strict On
 
Imports System.IO
Imports System.Threading
 
Public Class Form1
 
    Private Sub TheProcess()
        Dim myProcess As Process = New Process
 
        myProcess.StartInfo.WorkingDirectory = Application.StartupPath
        myProcess.StartInfo.FileName = "cmd.exe"
        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.CreateNoWindow = True
        myProcess.StartInfo.RedirectStandardInput = True
        myProcess.StartInfo.RedirectStandardOutput = True
        myProcess.StartInfo.RedirectStandardError = True
 
        myProcess.Start()
        myProcess.PriorityClass = ProcessPriorityClass.Idle
 
        Dim sIn As StreamWriter = myProcess.StandardInput
        sIn.AutoFlush = True
 
        Dim sOut As StreamReader = myProcess.StandardOutput
        Dim sErr As StreamReader = myProcess.StandardError
 
        sIn.Write("flac -d --stdout file.flac | lame -V9 - file.mp3" & System.Environment.NewLine)
        sIn.Write("exit" & System.Environment.NewLine)
 
        myProcess.WaitForExit()
 
        If Not myProcess.HasExited Then
            myProcess.Kill()
        End If
 
        Control.CheckForIllegalCrossThreadCalls = False
        TextBox1.Text = sErr.ReadToEnd
 
        sIn.Close()
        sOut.Close()
        sErr.Close()
        myProcess.Close()
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim t As Thread = New Thread(AddressOf TheProcess)
        t.Name = "TheProcess"
        t.IsBackground = True
        t.Priority = ThreadPriority.Lowest
        t.Start()
    End Sub
End Class

                                  
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:

Select allOpen in new window

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2007-12-08 at 04:09:58ID23010537
Tags

redirect

,

console

,

output

Topics

Microsoft Visual Basic.Net

,

.NET

,

Microsoft Visual C#.Net

Participating Experts
4
Points
500
Comments
16

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Embedded Vs Realtime
    What is the difference between Embedded Software and RealTime Software?
  2. Realtime Form
    In Oracle Form 6.0 How to make a form that act like a realtime software, if other user update or add new record to table being used by Form Block will refresh (execute query) again Now I use timer, every X minute execute query but it's very2 bad Thank's a lot [nds]
  3. Realtime Output in PHP?
    Hi, I currently have a HTML page which has a text box / submit button in the top frame and a blank page for the bottom frame. The submit button calls upon a php script (generate.php) and outputs whatever was typed in the text area into the bottom frame. Would it be possible ...
  4. Realtime data and Crosstab queries
    I have a table (history) that is in another DB and I only have read access. I have a Crosstab query based on that table that sorts Barcode counts by hour and reader. I then have a form that uses the Crosstab query to display the data. The users can then click a refresh ...
  5. Oracle/VB.NET: Monitor Database Realtime
    I have a VB.NET WinForms application that I would like to have monitor a specific table within an Oracle database in realtime (or as near realtime as possible). Basically, if a new record gets insert,updated, or deleted from this table I want my application to display the ch...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: GreenGhostPosted on 2007-12-08 at 17:53:22ID: 20435812

Add a method to handle the output:

Shared Sub ErrorHandler(sendingProcess As Object, errLine As DataReceivedEventArgs)
   If Not String.IsNullOrEmpty(errLine.Data) Then
      TextBox1.Text += errLine.Data
   End If
End Sub

After you started the process, use asynchronous read to read from the error stream:

AddHandler myProcess.ErrorDataReceived, AddressOf ErrorHandler
myProcess.BeginErrorReadLine()

 

by: narmi2Posted on 2007-12-09 at 04:09:32ID: 20436752

I tried that and nothing went into the textbox at all this time.  Not even when the process ended.  However, the process did work, it just displayed nothing in the textbox.  I now have this code, have I done something wrong?

Option Strict On
 
Imports System.IO
Imports System.Threading
 
Public Class Form1
 
    Private Sub TheProcess()
        Dim myProcess As Process = New Process
 
        myProcess.StartInfo.WorkingDirectory = Application.StartupPath
        myProcess.StartInfo.FileName = "cmd.exe"
        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.CreateNoWindow = True
        myProcess.StartInfo.RedirectStandardInput = True
        myProcess.StartInfo.RedirectStandardOutput = True
        myProcess.StartInfo.RedirectStandardError = True
 
        myProcess.Start()
        myProcess.PriorityClass = ProcessPriorityClass.Idle
 
        Dim sIn As StreamWriter = myProcess.StandardInput
        sIn.AutoFlush = True
 
        'Dim sOut As StreamReader = myProcess.StandardOutput
        'Dim sErr As StreamReader = myProcess.StandardError
 
        sIn.Write("flac -d --stdout file.flac | lame -V9 - file.mp3" & System.Environment.NewLine)
        sIn.Write("exit" & System.Environment.NewLine)
 
        AddHandler myProcess.ErrorDataReceived, AddressOf ErrorHandler
        myProcess.BeginErrorReadLine()
 
        myProcess.WaitForExit()
 
        If Not myProcess.HasExited Then
            myProcess.Kill()
        End If
 
        'Control.CheckForIllegalCrossThreadCalls = False
        'TextBox1.Text = sErr.ReadToEnd
 
        sIn.Close()
        'sOut.Close()
        'sErr.Close()
        myProcess.Close()
    End Sub
 
    Shared Sub ErrorHandler(ByVal sendingProcess As Object, ByVal errLine As DataReceivedEventArgs)
        If Not String.IsNullOrEmpty(errLine.Data) Then
            Form1.TextBox1.Text += errLine.Data
        End If
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim t As Thread = New Thread(AddressOf TheProcess)
        t.Name = "TheProcess"
        t.IsBackground = True
        t.Priority = ThreadPriority.Lowest
        t.Start()
    End Sub
End Class

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:

Select allOpen in new window

 

by: GreenGhostPosted on 2007-12-09 at 05:12:24ID: 20436912

You still have the WaitForExit call, which will keep the textbox from displaying any change before the process exists. Even if the text changes while the process is running, it will not show until the control is returned to the system so that it can handle the events that actually displays the change.

It should show up eventually, though...

As the handler is called in a separate thread, perhaps you need to invoke the code in the main thread to access the text box correctly:

http://msdn2.microsoft.com/en-us/library/a06c0dc2.aspx


Here you will find an example of how to use BeginErrorReadLine, that you can compare to your code:

http://msdn2.microsoft.com/en-us/library/system.diagnostics.process.beginerrorreadline.aspx

 

by: narmi2Posted on 2007-12-09 at 08:04:40ID: 20437287

When I take out the WaitFor Exit call, the process stops working altogether.  I tried following those links but they confused me even more...

 

by: GreenGhostPosted on 2007-12-09 at 08:43:29ID: 20437361

Did you also remove the code that kills and closes the process?

 

by: narmi2Posted on 2007-12-10 at 02:29:16ID: 20440483

No, I will try that tonight.  However, nothing appears in the textbox at all, even when the process has finished...

 

by: GreenGhostPosted on 2007-12-10 at 08:38:35ID: 20442860

If you kill the process immediately after you have started it, I would be surprised if it would output anything...

If you want the output in a text box, you have to start the process and let it run in the background, while the main process can handle the normal window messages, like repainting the text box.

 

by: GreenGhostPosted on 2007-12-29 at 10:22:22ID: 20548466

Checking back to see if you had any progress?

 

by: narmi2Posted on 2007-12-30 at 07:15:52ID: 20550985

It's beyond me, I can't seem to get it to work...

 

by: GreenGhostPosted on 2007-12-30 at 09:35:45ID: 20551419

Here's a working example:

Imports System.IO
Imports System.Threading
 
Public Class Form1
 
	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
	End Sub
 
	Sub OutputHandler(ByVal sendingProcess As Object, ByVal line As DataReceivedEventArgs)
		If Not String.IsNullOrEmpty(line.Data) Then
			TextBox1.BeginInvoke(New AddTextDelegate(AddressOf AddText), line.Data)
		End If
	End Sub
 
	Delegate Sub AddTextDelegate(ByVal text As String)
 
	Sub AddText(ByVal text As String)
		TextBox1.Text += text + Environment.NewLine
	End Sub
 
	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		TextBox1.Text = String.Empty
		Dim t As Thread = New Thread(AddressOf TheProcess)
		t.Name = "TheProcess"
		t.IsBackground = True
		t.Priority = ThreadPriority.Lowest
		t.Start()
	End Sub
 
	Private Sub TheProcess()
		Dim process As New Process()
		process.StartInfo.WorkingDirectory = Application.StartupPath
		process.StartInfo.FileName = "cmd.exe"
		process.StartInfo.UseShellExecute = False
		process.StartInfo.CreateNoWindow = True
		process.StartInfo.RedirectStandardInput = True
		process.StartInfo.RedirectStandardOutput = True
		process.Start()
		process.PriorityClass = ProcessPriorityClass.Idle
 
		Dim sIn As StreamWriter = process.StandardInput
		sIn.AutoFlush = True
 
		sIn.Write("dir c:\windows" & System.Environment.NewLine)
		sIn.Write("exit" & System.Environment.NewLine)
 
		AddHandler process.OutputDataReceived, AddressOf OutputHandler
		process.BeginOutputReadLine()
 
		process.WaitForExit()
		process.Dispose()
	End Sub
 
End Class
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:

Select allOpen in new window

 

by: GreenGhostPosted on 2008-01-17 at 12:22:57ID: 20684964

Checking back to see if you had any progress?

 

by: schworakPosted on 2008-02-03 at 08:50:53ID: 20809140

I am new to VB.NET and I am trying to do the same thing. I copy your code and run into one problem in Visual Studio .NET 2003...

Sub OutputHandler(ByVal sendingProcess As Object, ByVal line As DataReceivedEventArgs)


The developer says it doesn't know what to do with DataReceivedEventArgs It says it is not a data type. I am missing a step some place but have no idea where.

 

by: GreenGhostPosted on 2008-02-03 at 13:40:38ID: 20810408

The Process class doesn't have any OutputDataReceived event in framework 1.1. This event is new in framework 2.0.

 

by: Computer101Posted on 2008-04-04 at 15:32:34ID: 21286106

Forced accept.

Computer101
EE Admin

 

by: flosoftPosted on 2009-11-26 at 21:53:28ID: 25919064

Code does not work.

He was asking for realtime feedback, not the feedback once the process had completed.

I think what he was looking for was for example converting a video file using a command line tool. If you run the tool in a normal command prompt it probably reports percentage complete and other info as it moves along, I think this is what he wanted.

You will have to put the read code into some kind of a loop, watching for new output until the command exits. Calling exit prior to writing back the info is pointless.

The code posted will not work for what the OP had asked.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...