2013-07-07 4 views
2

실행 파일을 호출하고 싶습니다 (필자의 경우 PNGOUT.exe 임). stdout에서 출력을 가져옵니다. 그러나 응용 프로그램은 이전에 인쇄 된 출력 (진행 상황 표시)을 대체하기 위해 일종의 제어 문자를 사용하고 C# 클래스는이를 행복하게 기록하고 출력 문자열을 분석하려고 할 때 심각한 두통을 겪습니다. 내가 하나가 텍스트의 최종 상태를 캡처 다른 방법을 사용할 필요가제어 문자를 사용하는 콘솔 응용 프로그램의 출력을 처리하는 방법은 무엇입니까?

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; 
} 

: 나는 다음과 같은 방법으로 실행 전화 드렸습니다

을 (내 문자열로 무슨 일이 일어나고 있는지 파악하는 것이도 잠시했다) 콘솔에서 또는 어떻게 든 result (단순히 삭제하지 않고 마지막 모양을 얻기 위해 문자열에 "적용")의 제어 문자를 제거하십시오. 어떻게 할 수 있습니까?

+0

제어 문자가 이스케이프됩니까? (예 : '\ t'대신 '\\ t')? – keyboardP

+0

단순히 문자열을 인쇄하면 최종 텍스트로 보입니다. 따라서 생각하지 않으므로 이스케이프 처리되지 않습니다. –

+1

이스케이프 처리되지 않은 경우 Base64가 아마도 인코딩 되었습니까? 기본적으로 입력 내용을 결정해야합니다. –

답변

1

출력에는 \ r이 포함되어있어 커서를 현재 줄의 처음으로 간단하게 반환합니다. 사실이라면 현재 줄을 지워 문자열을 적절하게 조정할 수 있습니다. 그것은 간단하지 않지만, 이전 줄을 덮어 써야합니다. 몇 가지 코드로 작업하고 솔루션에 도달 할 수 있는지 확인합니다.

편집 :가 여기에 내가 생각 해낸 해결책 - 그것은 테스트 가볍게을합니다. 출력은 lines 변수에 있으며, 개별적으로 분석하거나 함께 참여하여 단일 행으로 분석 할 수 있습니다.

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<lines.Length; j++) 
{ 
    string line = lines[j]; 
    if (line.Contains('\r')) 
    { 
     string[] subLines = line.Split('\r'); 
     char[] mainLine = subLines[0].ToCharArray(); 
     for(int i=1; i<subLines.Length; i++) 
     { 
      string subLine = Regex.Replace(subLines[i], ".\x0008(.)", "$1"); 
      if (subLine.Length > mainLine.Length) mainLine = subLine.ToCharArray(); 
      else subLine.CopyTo(0, mainLine, 0, subLine.Length); 
     } 
     lines[j] = new String(mainLine); 
    } 
} 
+0

\ r이 동작을 일으킬 수있는 유일한 기호입니까? 그러면 조금 더 간단해질 수 있습니다. –

+0

이 동작을 일으킬 수있는 * 유일한 * 기호가 아닐 수도 있지만 가장 많이 사용되는 기호입니다. 내 솔루션을 추가했습니다. 기본적으로 각 "true"라인을 반복하고 필요에 따라 업데이트합니다. –

+1

매우 일반적인 '\ b'을 잊지 마십시오. –