You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何退出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:20:35