2011-09-15 4 views
0

현재 자동화 된 설치 시스템에서 작업하고 있습니다. 작동 원리는 설치가 필요한 것들이 설치를 관리하는 cmd 파일과 함께 패키지화되어 있다는 것입니다. msi 또는 exe 인 경우 cmd 파일은 설치 프로그램에 필요한 답변을 표시합니다. sqlcmd에서 SQL 스크립트를 실행하는 경우 SQL 스크립트입니다.System.Diagnostics.Process에서 실행중인 cmd 파일에서 오류/실패를보고합니다.

 ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo(filePath + fileToRun); 
     p.WorkingDirectory = filePath; 
     Process proc = new System.Diagnostics.Process(); 
     proc.StartInfo = p; 

     proc.Start(); 
     proc.WaitForExit(); 

을 그리고 그것은 잘 작동 :

cmd를 파일은 다음 C# 코드를 통해 실행됩니다. 그것은 그것이하기로되어있는 것을합니다.

그러나이 문제는 자동화되어 있으며 일부 구성 요소는 이전 구성 요소의 존재 여부에 따라 달라 지므로 주어진 환경에 설치되어있는 구성 요소와 그렇지 않은 구성 요소를 시스템이 정확하게 알고 있어야합니다. 그래서 cmd 파일이 어떤 이유로 실패하면 C# 코드가 그것에 대해 알아야합니다.

어떻게해야하는지 알 수 없습니다. System.Diagnostics.Process는 실행중인 작업을 격리하는 것으로 보이며 실행중인 프로세스 내부에서 어떤 일이 벌어지고 있는지 전혀 알지 못합니다. 실패를 나타내는 오류는 많은 소스에서 발생할 수 있습니다. cmd 파일이나 SQL 스크립트 또는 설치 프로그램이나 powershell 일 수 있습니다.

프로세스에 오류가 발생했을 때 코드를 인식 할 수있는 방법이 있습니까? 코드를 실행하는 cmd 파일을 변경하고 거기에서 오류를 가져오고 시도 할 수는 있지만 cmd가 실행하려고하는 파일을 편집 할 수 없습니다. 그리고 cmd 파일에서 오류를 격리 할 수 ​​있다고해도 C#으로 다시보고하는 방법은 무엇입니까?

환호, 매트

답변

2

당신은 프로세스의 오류 출력을 리디렉션 및 응용 프로그램에서 사용할 수 있습니다.

p.UseShellExecute = false; // necessary to redirect stderr 
p.RedirectStandardError = true; 

당신이 그것을 제어 할 경우 다음

string error = proc.StandardError.ReadToEnd(); 
proc.WaitForExit(); 

또는, 당신은 또한 당신의 과정에서 실패에 대한 몇 가지 의미가 종료 코드를 선택할 수 있으며, 다음 C# 코드에서 그들을 전환. 뭔가가 ...

+0

stderr * after * 프로세스가 종료 된 후 매우 위험하므로 교착 상태가 발생하기 쉽습니다. 프로세스가 stderr 출력 버퍼를 읽는 것을 기다리는 동안 멈추게됩니다. –

+0

종료를 기다리기 전에 읽도록 ​​업데이트되었습니다. –

+0

지금 해봐. 문제가없는 cmd가 실행되는 경우에도 오류 문자열이 항상 "처리가 잘못됨"오류로 가득 찬 이유를 알고 싶습니까? –