Executing Command line .exe with parameters in C#

梦想的初衷 提交于 2019-11-29 11:08:59

Wait for the process to end (let it do its work):

ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command);

procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;

// wrap IDisposable into using (in order to release hProcess) 
using(Process process = new Process()) {
  process.StartInfo = procStartInfo;
  process.Start();

  // Add this: wait until process does its work
  process.WaitForExit();

  // and only then read the result
  string result = process.StandardOutput.ReadToEnd();
  Console.WriteLine(result);
}

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"

public bool ExecuteCommand(string exeDir, string args)
{
  try
  {
    ProcessStartInfo procStartInfo = new ProcessStartInfo();

    procStartInfo.FileName = exeDir;
    procStartInfo.Arguments = args;
    procStartInfo.RedirectStandardOutput = true;
    procStartInfo.UseShellExecute = false;
    procStartInfo.CreateNoWindow = true;

    using (Process process = new Process())
    {
      process.StartInfo = procStartInfo;
      process.Start();

      process.WaitForExit();

      string result = process.StandardOutput.ReadToEnd();
      Console.WriteLine(result);
    }
    return true;
  }
  catch (Exception ex)
  {
    Console.WriteLine("*** Error occured executing the following commands.");
    Console.WriteLine(exeDir);
    Console.WriteLine(args);
    Console.WriteLine(ex.Message);
    return false;
  }

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:

var cli = new Cli("cmd");
var output = cli.Execute("/c " + command);
var stdout = output.StandardOutput;
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!