2008-09-30 9 views
5

나는 스케쥴러를 작성 중이거나 정렬 중이다. 기본적으로 exe (예 : "C : \ a.exe") 목록과 매분마다 테이블의 레코드를보고 아직 실행되지 않은 작업을 실행하는 콘솔 응용 프로그램이있는 테이블입니다. 특정 작업이 실패 할 경우.Net System.Diagnostics.Process가 성공적으로 실행되었거나 실패했는지 어떻게 알 수 있습니까?

System.Diagnostics.Process p = new System.Diagnostics.Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.FileName = someExe; // like "a.exe" 
p.Start(); 

어떻게 내가 말할 수 :

이 같은 작업을 실행? 예를 들어 a.exe에서 처리되지 않은 예외가 발생하면 어떻게해야합니까? 위의 코드에서 이러한 일이 발생하고 "특정 작업이 실패한"등의 작업 테이블을 업데이트하는 경우를 알고 싶습니다.

어떻게하면됩니까?

나는 다른 사람이하지 말라고했기 때문에 SQL 에이전트 나 Windows 스케줄러를 사용하지 않습니다. 그는 더 많은 "경험"을 가지고 있으므로 기본적으로 명령을 따르고 있습니다. 대안을 제안 해 주시기 바랍니다.

답변

8

Win32Exception은 파일이 없거나 실행 액세스가 거부되어 Process.Start()이 실패했는지 확인하는 데 사용할 수 있습니다.

그러나이 클래스를 사용하여 생성 한 프로세스가 던진 예외는 catch 할 수 없습니다. 첫 번째로 .NET에서 응용 프로그램을 작성하지 않아 예외 개념이 전혀 없을 수도 있습니다.

응용 프로그램의 ExitCode을 확인하거나 StandardOutputStandardError 스트림을 읽어 오류 메시지의 게시 여부를 확인하십시오.

5

나는 당신이 Process.ExitCode를 찾고 있다고 생각한다. WaitForExit()을 사용해야 할 수도 있습니다. 또한 응용 프로그램이 stderr로 보낼 때 트리거되는 ErrorDataReceived 이벤트가 있습니다.

+0

예를 보려면 http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exitcode.aspx를 참조하십시오. – marcj

2

가 ExitCode 이외에, 당신은 또한 같은 것을 할 수 있습니다 : 명령 창에 기록 된 것 모두를 사로 잡을 것입니다

string output = p.StandardOutput.ReadToEnd(); 

. 그런 다음 해당 문자열에 대해 응용 프로그램에 따라 오류를 표시하는 알려진 패턴을 파싱 할 수 있습니다.

+0

이것을 사용하여 교착 상태에주의해야합니다! http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutputput.aspx – hova

0

@jop가 확장 한 것을 확장하십시오. 또한 프로세스가 닫힐 때까지 기다려야합니다. 따라서 :

 p.Start(); 
     p.WaitForExit(); 
     int returnCode = p.ExitCode; 

일반적으로 0이 아닌 코드는 오류입니다. 부정한 것들은 에러이고, 긍정적 인 것들은 상태 코드/경고입니다.

관련 문제