Du hast StandardOutput und StandardError umgeleitet aber liest nur StandardOutput und außerdem erst nach WaitForExit(). systeminfo produziert deutlich mehr Text als ipconfig und sobald eine der Pipes voll ist, blockiert der Kindprozess beim Schreiben und beendet sich nie - WaitForExit() wartet “für immer”. ipconfig ist kurz genug, dass die Puffer meist nicht volllaufen, deshalb funktioniert es zufällig.
var sb = new StringBuilder();
var psi = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = "/c " + command,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
// optional bei deutscher Ausgabe:
// StandardOutputEncoding = Encoding.GetEncoding(850),
// StandardErrorEncoding = Encoding.GetEncoding(850),
};
using var process = new Process { StartInfo = psi };
process.OutputDataReceived += (s, e) => { if (e.Data != null) sb.AppendLine(e.Data); };
process.ErrorDataReceived += (s, e) => { if (e.Data != null) sb.AppendLine(e.Data); };
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();