Process.start: how to get the output?
When you create your Process
object set StartInfo
appropriately:
var proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "program.exe",
Arguments = "command line arguments to your executable",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
then start the process and read from it:
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
string line = proc.StandardOutput.ReadLine();
// do something with line
}
You can use int.Parse()
or int.TryParse()
to convert the strings to numeric values. You may have to do some string manipulation first if there are invalid numeric characters in the strings you read.
Capture output of process synchronously (i.e. when it happens )
For my specific situation, the solution is what Mr Moses suggested in a comment above, i.e. run iisreset /stop
followed by iisreset /start
.
I need a proper answer, rather than a comment, in order to mark it as my "accepted answer", so this answer is more of administrativa than a new contribution. The cred should go to Mr Moses.. :-)
Capturing console output from a .NET application (C#)
This can be quite easily achieved using the ProcessStartInfo.RedirectStandardOutput property. A full sample is contained in the linked MSDN documentation; the only caveat is that you may have to redirect the standard error stream as well to see all output of your application.
Process compiler = new Process();
compiler.StartInfo.FileName = "csc.exe";
compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs";
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();
Console.WriteLine(compiler.StandardOutput.ReadToEnd());
compiler.WaitForExit();
Node.js spawn child process and get terminal output live
I'm still getting my feet wet with Node.js, but I have a few ideas. first, I believe you need to use execFile
instead of spawn
; execFile
is for when you have the path to a script, whereas spawn
is for executing a well-known command that Node.js can resolve against your system path.
1. Provide a callback to process the buffered output:
var child = require('child_process').execFile('path/to/script', [
'arg1', 'arg2', 'arg3',
], function(err, stdout, stderr) {
// Node.js will invoke this callback when process terminates.
console.log(stdout);
});
2. Add a listener to the child process' stdout stream (9thport.net)
var child = require('child_process').execFile('path/to/script', [
'arg1', 'arg2', 'arg3' ]);
// use event hooks to provide a callback to execute when data are available:
child.stdout.on('data', function(data) {
console.log(data.toString());
});
Further, there appear to be options whereby you can detach the spawned process from Node's controlling terminal, which would allow it to run asynchronously. I haven't tested this yet, but there are examples in the API docs that go something like this:
child = require('child_process').execFile('path/to/script', [
'arg1', 'arg2', 'arg3',
], {
// detachment and ignored stdin are the key here:
detached: true,
stdio: [ 'ignore', 1, 2 ]
});
// and unref() somehow disentangles the child's event loop from the parent's:
child.unref();
child.stdout.on('data', function(data) {
console.log(data.toString());
});
Empty standard output when run an exe file using C#
Your C# code is correct. The standard way of capturing the output of a console process is to redirect the standard output by setting the process object's StartInfo.RedirectStandardOutput
property to true
, as described here. This is exactly what you have done.
The problem, as correctly diagnosed by rkhb, is that you're using the Irvine32 library in the auxiliary process, and its implementation of dumpregs
calls the Win32 WriteConsole
function, which cannot be redirected. If you attempt to redirect the standard output (e.g., to a pipe or file), then WriteConsole
will fail with ERROR_INVALID_HANDLE
, as documented on MSDN:
ReadConsole
andWriteConsole
can only be used with console handles;ReadFile
andWriteFile
can be used with other handles (such as files or pipes).ReadConsole
andWriteConsole
fail if used with a standard handle that has been redirected and is no longer a console handle.
Like rkhb's comment, this except from the documentation also hints at the solution. To support redirection, you need to change the implementation of dumpregs
to call WriteFile
instead of WriteConsole
. This is a more general function that can write to any type of handle, including the standard console output (a la WriteConsole
) or any other type of object that you might redirect the output to. Once you've made this change, you will, of course, need to rebuild the Irvine32 library.
The only significant limitation of WriteFile
is that it doesn't support Unicode output like WriteConsole
does, but that isn't a problem in your case. The output of dumpregs
is all ANSI.
Related Topics
Dpi Awareness - Unaware in One Release, System Aware in the Other
Why Would You Use String.Equals Over ==
Raw SQL Query Without Dbset - Entity Framework Core
How to Update the Current Line in a C# Windows Console App
Getting Multiple Keys of Specified Value of a Generic Dictionary
Copy Datagridview Values to Textbox
Which .Net Dependency Injection Frameworks Are Worth Looking Into
How to Start a Process as Administrator Mode in C#
Comparing Two Byte Arrays in .Net
Unsubscribe Anonymous Method in C#
Visual Studio Publish Project into One Simple Installer
How to Check If a Given String Is a Legal/Valid File Name Under Windows
Tips For Optimizing C#/.Net Programs
Login Failed For User 'Iis Apppool\Asp.Net V4.0'
Best Timer For Using in a Windows Service
Plain Old Clr Object VS Data Transfer Object
How to Ensure That a Division of Integers Is Always Rounded Up