如何区分C#中ProcessStartInfo运行的并行Git命令输出?
区分并行Git命令输出的几种实用方法
方法1:给每个命令添加专属起止标记
在每个Git命令的前后插入唯一的标识文本,捕获输出后可通过这些标记分割出对应命令的内容。比如构造如下复合命令:
echo "===START:GIT_PULL===" & git pull & echo "===END:GIT_PULL===" & echo "===START:GIT_STATUS===" & git status & echo "===END:GIT_STATUS==="
在C#中捕获输出后,通过匹配===START:XXX===和===END:XXX===即可将中间内容归属到对应命令。虽然并行执行会导致标记与输出穿插,但只要标记唯一,就能准确划分输出块。
方法2:启动独立的Process实例(推荐)
不要依赖Shell的&实现并行,而是在C#中为每个Git命令单独创建Process对象。每个进程的输出流完全独立,可分别绑定处理逻辑,彻底避免输出混乱。示例代码:
// 处理git pull的进程 var pullInfo = new ProcessStartInfo("git", "pull") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; var pullProcess = new Process { StartInfo = pullInfo }; pullProcess.OutputDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) Console.WriteLine($"[GIT_PULL] {e.Data}"); }; pullProcess.ErrorDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) Console.WriteLine($"[GIT_PULL_ERROR] {e.Data}"); }; pullProcess.Start(); pullProcess.BeginOutputReadLine(); pullProcess.BeginErrorReadLine(); // 处理git status的进程 var statusInfo = new ProcessStartInfo("git", "status") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; var statusProcess = new Process { StartInfo = statusInfo }; statusProcess.OutputDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) Console.WriteLine($"[GIT_STATUS] {e.Data}"); }; statusProcess.ErrorDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) Console.WriteLine($"[GIT_STATUS_ERROR] {e.Data}"); }; statusProcess.Start(); statusProcess.BeginOutputReadLine(); statusProcess.BeginErrorReadLine(); // 等待所有进程完成 pullProcess.WaitForExit(); statusProcess.WaitForExit();
这种方式不仅能完美隔离输出,还能单独控制每个命令的超时、优先级等,调试和维护更便捷。
方法3:给每行输出添加专属前缀
若必须用Shell的&并行,可通过命令行工具给每个Git命令的输出行添加专属前缀:
- Linux/macOS:用
sed给每行加前缀
git pull | sed 's/^/[GIT_PULL] /' & git status | sed 's/^/[GIT_STATUS] /'
- Windows:用
cmd循环配合more实现类似效果
git pull | cmd /c "for /f ""tokens=*"" %a in ('more') do echo [GIT_PULL] %a" & git status | cmd /c "for /f ""tokens=*"" %a in ('more') do echo [GIT_STATUS] %a"
捕获到的每一行输出都会带有对应命令标识,可直接区分来源。
内容的提问来源于stack exchange,提问作者Clicksurfer
相关产品推荐
相关产品推荐

