Samvel Siradeghyan
Samvel Siradeghyan

Reputation: 3583

How to run commands on Mingw from other process with C#?

I am trying to execute commands on Mingw from other process with this code:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"PATH-TO-MINGW\mingwenv.cmd";        
startInfo.UseShellExecute = false;
startInfo.RedirectStandardInput = true;

using (Process exeProcess = Process.Start(startInfo))
{                
   StreamWriter str = exeProcess.StandardInput;
   str.WriteLine("ls");               

   exeProcess.WaitForExit();
}

but this code just lunches Mingw and does not input command.
Do I miss something or it is not possible to do?
Thanks
Update
Based on Jason Huntleys answer, solution for me looks like this (I am using OMNeT++ simulator so directories are based on it)

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"PATH_TO_SIMULATOR\omnetpp-4.3\msys\bin\sh.exe";
startInfo.UseShellExecute = false;
startInfo.RedirectStandardInput = true;
using (Process exeProcess = Process.Start(startInfo))
{
   using (StreamWriter str = exeProcess.StandardInput)
   {
       str.WriteLine("cd PATH_TO_SIMULATOR/omnetpp-4.3");
       str.Flush();

       str.WriteLine("ls");
       str.Flush();
   }         

   exeProcess.WaitForExit();               
}

Upvotes: 3

Views: 1627

Answers (2)

Jason Huntley
Jason Huntley

Reputation: 3877

I suspect c# is launching your mingw command in a CMD prompt. You need to spawn your process within a bash shell. Try wrapping your command with "bash -l -c 'ls'" or "bash -c 'ls'". Make sure bash is in your PATH, and be sure you quote command arguments, if any. I've had to use this method when I spawn bash commands from popen in python. I know diff language, but could be related.

I imagine the code will look similar to this. I haven't tested in C#:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "bash.exe";
startInfo.Arguments = "-l -c 'ls -l /your/msys/path'";
# Or other examples with windows path:
#   startInfo.Arguments = "-l -c 'ls -l /c/your/path'";
#   startInfo.Arguments = "-l -c 'ls -l C:/your/path'";
#   startInfo.Arguments = "-l -c 'ls -l C:\\your\\path'";
process.StartInfo = startInfo;
process.Start();

Upvotes: 2

No Idea For Name
No Idea For Name

Reputation: 11577

you should do

str.Flush();

so the command you've writen is passed to the process.

also you should use using statement when dealing with streams

     using (Process exeProcess = Process.Start(startInfo))
     {
        using(StreamWriter str = exeProcess.StandardInput)
        {
           str.WriteLine("ls");
           str.Flush();

           exeProcess.WaitForExit();
        }
     }

Upvotes: 1

Related Questions