I'm trying to execute a command line program with parameters from C#. I would have imagined that standing this up and making this happen would be trivial in C# but its proving challenging even with all the resources available on the this site and beyond. I'm at a loss so I will provide as much detail as possible.
My current approach and code is below and in the debugger the variable command has the following value.
command = "C:\\Folder1\\Interfaces\\Folder2\\Common\\JREbin\\keytool.exe -import -noprompt -trustcacerts -alias myserver.us.goodstuff.world -file C:\\SSL_CERT.cer -storepass changeit -keystore keystore.jks"
The problem may be how I am calling and formatting the string I use in that variable command.
Any thoughts on what might be the issue?
ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command);
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
Process process = new Process();
process.StartInfo = procStartInfo;
process.Start();
string result = process.StandardOutput.ReadToEnd();
Console.WriteLine(result);
I get back no information or error in the variable result once its completes.
Wait for the process to end (let it do its work):
I realized I may have left out some detail that some people may need to solve this in the future.
Here are the values of the method parameters at run time. I had some confusion as to what the object ProcessStartInfo and Process needed to be stood up correctly I think others may as well.
exeDir = "C:\folder1\folder2\bin\keytool.exe"
args = "-delete -noprompt -alias server.us.goodstuff.world -storepass changeit -keystore keystore.jks"
Between Dmitry's assistance and the following resource,
http://www.codeproject.com/Articles/25983/How-to-Execute-a-Command-in-C
I was able to cobble this together. Thank you!
When it comes to executing CLI processes from C#, it may seem like a simple task, but there are quite a few pitfalls that you might not even notice until much later. For example, both of the currently given answers will not work if the child process writes enough data to stdout, as explained here.
I wrote a library that simplifies working with CLIs by abstracting the
Process
interaction entirely, solving the whole task by executing one method - CliWrap.Your code would then look like this: