我正尝试使用以下代码在其他进程中对Mingw执行命令:
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();
}
但是这段代码只是吃了Mingw而没有输入命令
我是否会遗漏某些事情或者无法做到这一点?
由于
的更新
基于Jason Huntleys answer,我的解决方案看起来像这样(我正在使用OMNeT ++模拟器,因此目录基于它)
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();
}
答案 0 :(得分:1)
你应该做
str.Flush();
所以你写的命令会传递给进程。
在处理流
时也应该使用using
语句
using (Process exeProcess = Process.Start(startInfo))
{
using(StreamWriter str = exeProcess.StandardInput)
{
str.WriteLine("ls");
str.Flush();
exeProcess.WaitForExit();
}
}
答案 1 :(得分:1)
我怀疑c#是在CMD提示符中启动你的mingw命令。您需要在bash shell中生成进程。尝试使用“bash -l -c'ls'”或“bash -c'ls'”包装命令。确保bash在你的PATH中,并确保你引用命令参数,如果有的话。当我在python中从popen生成bash命令时,我不得不使用这个方法。我知道差异语言,但可能是相关的。
我想代码看起来与此类似。我还没有在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();