Come gestire l’output dalle applicazioni della console che utilizzano i caratteri di controllo?

Voglio chiamare un eseguibile (nel mio caso, questo è PNGOUT.exe) e prendere il suo output da stdout. Ma si è rivelato complicato – l’applicazione utilizza una sorta di caratteri di controllo per sostituire l’output precedentemente stampato (visualizzazione del progresso), e le classi C # li registrano felicemente e quando voglio analizzare la stringa di output, ottengo un serio mal di testa. (Ci è voluto un po ‘di tempo per capire cosa sta succedendo con la mia stringa)

Sto chiamando eseguibile con il seguente metodo:

public static string RunPNGOut(string pngOutPath, string target) { var process = new Process { StartInfo = { UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true, FileName = pngOutPath, Arguments = '"' + target + '"' } }; process.Start(); var result = process.StandardOutput.ReadToEnd(); process.WaitForExit(); return result; } 

Ho bisogno di utilizzare un metodo diverso che catturi solo lo stato finale del testo nella console, o in qualche modo eliminare i caratteri di controllo nel result (non semplicemente eliminarli, ma “applicarli” alla stringa per ottenere l’aspetto finale). Come può essere fatto?

Molto probabilmente, l’output contiene \ r, che restituisce semplicemente il cursore all’inizio della riga corrente. Se ciò è vero, è ansible regolare la stringa di conseguenza cancellando la riga corrente. Non è semplice, però – devi anche sovrascrivere la riga precedente. Lavorerò su qualche codice e vedrò se riesco ad arrivare a una soluzione.

EDIT: Ecco la soluzione che ho trovato – è leggermente testato. L’output sarà nella variabile lines , che puoi analizzare singolarmente o unire insieme per analizzare come una singola riga.

 string rawOut = "Results:\r\n___ % done\r 10\r 20\r 30\r\nError!"; string[] lines = Regex.Split(rawOut, Environment.NewLine); for(int j=0; j mainLine.Length) mainLine = subLine.ToCharArray(); else subLine.CopyTo(0, mainLine, 0, subLine.Length); } lines[j] = new String(mainLine); } }