我想在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
文件。
但它有一些问题:
所以这个问题还没有解决。
试试这个,如果我明白你的问题,这可能有帮助。
string strCmdText; strCmdText= "bash -c \"time\""; System.Diagnostics.Process.Start("CMD.exe",strCmdText);