如何在c#中运行windows bash

本文关键字:运行 windows bash | 更新日期: 2023-09-27 18:11:48

我想在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()
编辑:

我可以成功运行包含我的命令的批处理文件。但是我想像下面的代码那样获取输出:

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.

如何在c#中运行windows bash

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

如果您尝试将RedirectStandardOutput设置为true,然而,您将得到的是E r r o r : 0 x 8 0 0 7 0 0 5 7,对应于Win32的ERROR_INVALID_PARAMETER

我发现的一件事是,如果你没有将任何Redirect属性设置为true, Bash似乎继承了当前的控制台,但是你甚至不能在。net程序上重定向启动Bash的标准输出…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);