如何退出StreamWriter并将Git Log命令输出转为字符串做后续处理?
解决C#调用Git日志并获取输出的问题
方案一:改进原CMD调用方式
原代码未重定向输出流,也未正确处理进程执行流程,调整后可获取命令输出:
Process process = new Process(); ProcessStartInfo info = new ProcessStartInfo(); info.FileName = "cmd.exe"; info.RedirectStandardInput = true; info.RedirectStandardOutput = true; info.RedirectStandardError = true; info.UseShellExecute = false; info.CreateNoWindow = true; // 可选,隐藏CMD窗口 process.StartInfo = info; process.Start(); // 写入命令后关闭输入流,告知CMD命令已结束 using (StreamWriter writer = process.StandardInput) { if (writer.BaseStream.CanWrite) { writer.WriteLine("cd C:\\Users\\rene.krause\\source\\repos\\..."); writer.WriteLine("git log --pretty=oneline"); writer.Close(); } } // 读取输出与错误信息 string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); // 等待进程执行完毕再释放资源 process.WaitForExit(); process.Close(); // 后续处理输出内容 Console.WriteLine(output); if (!string.IsNullOrEmpty(error)) { Console.WriteLine("错误信息:" + error); }
方案二:直接调用Git(更高效推荐)
无需通过CMD中转,直接调用Git.exe并指定工作目录,代码更简洁:
Process process = new Process(); ProcessStartInfo info = new ProcessStartInfo(); // 若系统环境变量未配置Git路径,可写完整路径如:"C:\\Program Files\\Git\\bin\\git.exe" info.FileName = "git.exe"; info.WorkingDirectory = "C:\\Users\\rene.krause\\source\\repos\\..."; info.Arguments = "log --pretty=oneline"; info.RedirectStandardOutput = true; info.RedirectStandardError = true; info.UseShellExecute = false; info.CreateNoWindow = true; process.StartInfo = info; process.Start(); // 读取执行结果 string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); process.Close(); // 处理输出或错误 if (!string.IsNullOrEmpty(error)) { Console.WriteLine("Git执行错误:" + error); } else { // 拆分日志行进行后续处理 string[] logLines = output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); foreach (string line in logLines) { string[] parts = line.Split(new[] { ' ' }, 2); if (parts.Length == 2) { string commitHash = parts[0]; string commitMessage = parts[1]; // 此处添加自定义处理逻辑 } } }
关键注意事项
- 必须重定向
StandardOutput和StandardError才能捕获命令执行的输出与错误信息 - 调用
WaitForExit()等待进程执行完成,避免提前读取导致内容不完整 - 直接调用Git.exe时,确保系统环境变量包含Git路径,或指定Git.exe的完整绝对路径
内容的提问来源于stack exchange,提问作者Rene Krause
相关产品推荐
相关产品推荐

