如何在C#中运行windows bash

我想在bash(Windows的Linux子系统)中运行以下命令:

bash -c "ls" 

并使用它在C#中是这样的:

 ProcessStartInfo info = new ProcessStartInfo("bash", "-c \"ls\""); Process p = Process.Start(info); p.WaitForExit(); 

但它给了我下面的例外:

 System.ComponentModel.Win32Exception was unhandled ErrorCode=-2147467259 HResult=-2147467259 Message=The system cannot find the file specified NativeErrorCode=2 Source=System StackTrace: at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo) at System.Diagnostics.Process.Start() at System.Diagnostics.Process.Start(ProcessStartInfo startInfo) at ConsoleApplication1.Program.Main(String[] args) in c:\users\matin\documents\visual studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:line 17 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() 

编辑:

我可以成功运行一个包含我的命令的batch file。 但是我想抓取下面的代码的输出:

 ProcessStartInfo info = new ProcessStartInfo("file.bat"); info.RedirectStandardOutput = true; info.UseShellExecute = false; Process p = Process.Start(info); while (!p.HasExited) Console.WriteLine(p.StandardOutput.ReadToEnd()); 

但它打印:

 'bash' is not recognized as an internal or external command, operable program or batch file. 

由于32位应用程序的Windows文件系统重定向 ,无法找到该文件。 您必须将x64编译为.NET应用程序才能启动C:\Windows\System32\bash.exe

但是,如果尝试将RedirectStandardOutput设置为true ,那么您将得到的是E rror : 0 x 8 0 0 7 0 0 5 7 ,它对应于Win32的ERROR_INVALID_PARAMETER

我发现的一件事是,如果你没有设置任何Redirect属性为真,Bash似乎继承了当前的控制台,但是你甚至不能在启动bash的.NET程序上重定向标准输出。会出现Windows当前不支持将Linux子系统应用程序的输出重定向到Win32。

一种解决方法可能是创建下面的批处理文件:

 bash -c "ls > log.txt" 

并使用下面的C#程序:

 ProcessStartInfo info = new ProcessStartInfo("file.bat"); Process p = Process.Start(info); p.WaitForExit(); Console.WriteLine(File.ReadAllText("log.txt")); 

输出将被写入log.txt文件。

但它有一些问题:

  1. 它打开一个cmd窗口来运行批处理文件。
  2. 在过程退出之前,您无法读取输出。
  3. 您不能重定向标准输入

所以这个问题还没有解决。

试试这个,如果我明白你的问题,这可能有帮助。

 string strCmdText; strCmdText= "bash -c \"time\""; System.Diagnostics.Process.Start("CMD.exe",strCmdText);