Recipe 11.21 Launching and Interacting withConsole Utilities
Problem
You have an application that
you need to automate and that takes input only from the standard
input stream. You need to drive this application via the commands it
will take over the standard input stream.
Solution
Say we needed to drive the CMD.EXE application
to display the current time with the TIME
/T command (it is possible to just run this
command from the command line, but this way we can demonstrate an
alternative method to drive an application that responds to standard
input). The way to do this is to launch a process that is looking for
input on the standard input stream.
This is accomplished via the
Process class StartInfo
property, which is an instance of a
ProcessStartInfo class.
The Process.Start method will launch a new
process, but the StartInfo property controls many
of the details of what sort of environment that process executes in.
First, make sure that the
StartInfo.RedirectStandardInput property is set to
true. This setting notifies the process that it
should read from standard input. Then set the
StartInfo.UseShellExecute property to
false because if you were to let the shell launch
the process for you, it would prevent you from redirecting standard
input.
Once this is done, launch the process and write to its standard input
stream as shown:
public void RunProcessToReadStdIn( )
{
Process application = new Process( );
// run the command shell
application.StartInfo.FileName = @"cmd.exe";
// turn on standard extensions
application.StartInfo.Arguments = "/E:ON";
application.StartInfo.RedirectStandardInput = true;
application.StartInfo.UseShellExecute = false;
// start it up
application.Start( );
// get stdin
StreamWriter input = application.StandardInput;
// run the command to display the time
input.WriteLine("TIME /T");
// stop the application we launched
input.WriteLine("exit");
}
Discussion
Once the input has been redirected, you can write into the standard
input stream of the process by getting the
Process.StandardInput property that is a
StreamWriter. Once you have that, you can send
things to the process via WriteLine calls, as
shown earlier.
In order to use StandardInput, you have to specify
true for the StartInfo property's
RedirectStandardInput property. Otherwise, reading
the StandardInput property throws an exception.
When UseShellExecute is false,
you can only use Process to create executable
processes. Normally the Process class can be used to perform
operations on the file, like printing a Microsoft Word document.
Another difference when using false is that the
working directory is not used to find the executable, so you should
be mindful to pass a full path or have the executable on your
PATH environment variable.
See Also
See the "Process Class,"
"ProcessStartInfo Class,"
"RedirectStandardInput Property,"
and "UseShellExecute Property"
topics in the MSDN documentation.
|