如何在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.
由于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
文件。
但是它有一些问题:
- 打开cmd窗口,以便运行批处理文件。
- 在进程退出之前不能读取输出。
- 不能重定向标准输入
所以问题还没有解决。
如果我理解你的问题,试试这个,这可能会有帮助。
string strCmdText;
strCmdText= "bash -c '"time'"";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);