2010-07-07 4 views
0

일련의 명령을 프로그래밍 방식으로 실행하려고 시도하고 있으며 오류 코드를 읽고 이러한 코드가 성공 또는 실패를 나타내면 이에 따라 대응할 수 있는지 검색합니다.어떤 프로그램이 오류 코드를 반환했는지 어떻게 알 수 있습니까?

현재 내 명령은 psexec을 사용하여 robocopy를 시작합니다. 나는 프로그램이 성공하면 대부분의 명령이 0의 오류 코드를 반환하지만 robocopy는 작업이 성공적이라 할지라도 0-8 범위의 값을 반환한다는 것이 이상하다는 것을 알아 냈습니다. 그래서 몇 가지 추가 논리를 추가하고 있습니다. robocopy가 실패를 제안하는 오류 코드를 반환 할 때주의해야 할 내 오류 감지.

문제는이 동일한 명령 집합에서 다양한 다른 실행 파일과 배치 파일을 실행하기 위해 PSExec을 사용하고 있기 때문에 robocopy가 이러한 오류 코드를 반환하는시기인지 알 수있는 오류 탐지 솔루션이 필요합니다. PSExec의 경우 robocopy에서 5의 오류 코드가 정상적으로 발생하기 때문에 보통 PSExec의 5라는 오류 코드는 액세스가 거부되었다고 말합니다.

제 질문은 어떤 프로그램이 오류 코드를 반환했는지 어떻게 알 수 있습니까? 나는 C# .NET 4.0을 사용하고 있으며, 이러한 프로그램을 프로그래밍 방식으로 시작하기 위해 Process 클래스를 사용하고 있습니다. 프로그램 이름을 psexec로 설정하고 인수에는 robocopy 또는 다른 프로그램이 포함됩니다. 그런 다음 출구를 기다리고 오류 코드를 저장 한 다음 구문 분석을 시도합니다.

모두 무엇을 제안합니까? 아니 이미 자신의 질문에 대답 적이

foreach (var command in commands) 
     { 
      // TODO: Add exception handling 
      string processName = command.Split(delimiters).ToList().ElementAt(0); // split up command into pieces, select first "token" as the process name 
      string commandArguments = command.Replace(processName + " ", ""); // remove the process name and following whitespace from the command itself, storing it in a new variable 
      Process commandProcess = new Process(); // declare a new process to be used 
      commandProcess.StartInfo.FileName = processName; // add file start info for filename to process 
      commandProcess.StartInfo.Arguments = commandArguments; // add file start info for arguments to process 
      commandProcess.StartInfo.UseShellExecute = false; // skip permissions request 
      commandProcess.Start(); // start process according to command's data 
      commandProcess.WaitForExit(); // wait for the process to exit before continuing 
      bool commandSuccessful = ParseCommandErrorCode(commandProcess, commandProcess.ExitCode); // grab error code 
      if (!commandSuccessful) 
      { 
       // ERROR! abort operation and inform the user of the last completed operation, and how many commands have not been run 
      } // end if 
      Console.WriteLine("Error code: {0}", commandProcess.ExitCode); // print error code 
      commandProcess.Close(); // close process 
     } // end foreach 

답변

0

: 여기

는 코드인가? 오류 코드를 각 유틸리티의 성공 또는 실패와 일치시켜야합니다. commandProcess.StartInfo.FileName은 유틸리티가 robocopy 또는 PSExe 인 경우 알려줍니다. 오류 코드를 구문 분석 할 때 파일의 이름에 따라 성공 또는 실패 값을 매핑하십시오.

+0

내가 직면하고있는 문제는 항상 Robocopy 또는 다른 실행 파일 또는 배치 파일이든 항상 PSExec을 사용하여 파일 이름이 항상 psexec이지만 인수가 항상 다릅니다. . 내 질문은 어떤 프로그램이 코드를 반환했는지 어떻게 결정할 수 있습니까? PSExec와 다른 프로그램 모두 실행 중입니다.하지만 robocopy가 실행되기 전에도 PSExec은 오류 코드 5가 거부되어 실패 할 수 있습니다. 어떤 코드가 어떤 프로그램에서 나왔는지 어떻게 알 수 있습니까? 아니면 추측 만 남았습니까? – Ben

+0

아. 알았다. 안타깝게도'PsExec'는 애플리케이션의 성공 여부에 관계없이 애플리케이션을 성공적으로 시작할 수있는 한 항상 성공할 것입니다. 따라서 PsExec 실행시 발생하는 오류 코드는 항상 PsExec에서 발생합니다. 해당 코드가 성공을 나타낼 경우 실제 응용 프로그램의 코드를 테스트합니다. 하나의 지저분한 방법은 'PsExec'을 사용하여 스크립트를 실행하는 것입니다. 그러면 PsExec이 애플리케이션을 실행하고 종료 코드를 가져 와서 코드를 파일에 씁니다. 그런 다음 파일에서 코드를 읽을 수 있습니다. – 341008

+0

감사합니다. 그것은 내가 두려워하는 것입니다 :/나는 결과에 대한 통계 분석을하고 robocopy 명령의 수를 저장하고 실패한 명령의 수를 0-8 범위로 비교하려고합니다. 실패 횟수가 robocopy 명령 수와 같거나 초과하면 PSExec/windows에서 문제가 발생하고 사용자에게 경고 할 수 있습니다. 그렇지 않으면 통계를 표시하고 계획에 따라 일이 진행되거나 개인적으로 조사해야하는 경우 사용자가 결정하도록 할 수 있습니다. – Ben

0

큰 데이터베이스를 백업하므로 명령 파일 .cmd가 있습니다. 내가 mny를 가지고있다. ROBOCOPY cource destination과 arguments를 시작한다. * b * c * c * 등의 각 프로세스 스크립트 라인. 예제 : sample.cmd 파일에서 (btach 파일로 작동), 다음 스크립트 라인이있다. 같은 sample.cmd 파일 :

시작 ROBOCOY SRC 최종 도착 A * B * C */z/w 1, R 1

시작 ROBOCOY SRC 최종 도착 위해 D * E * f를 *를 g */z/w : 1, R : w 1

시작 ROBOCOY SRC 최종 도착 시간 *의 K * P * Y */z/1, R 1

시작 ROBOCOY SRC 최종 도착 XRY * SRP */z/w 1 개 (R) : 1

내가 럼> Robocopy sample.cmd 나는 cmd.exe와 다른 4 개의 콘솔 윈도우 robocoy.exe가 위의 명령에 따라 동시에 파일을 복사하는 것으로 시작하여 파일이있을 경우 대기 시간이 있으므로 다른 파일을 기다립니다. 다른 프로세스에서 사용합니다. 그것이 일을 동시에하는 것처럼 더 빠릅니다.

는 지금은 콘솔을 명령하는 것 대신에 프로세스를 실행 C#을 창을 사용하여 GUI Devloping은 오전

주()

{

Process.Start를 (샘플의 "경로를 시작 .cmd를 ")

()가

label.text =

process.waitforexit "는 oneprocess의 제어, 즉 cmd.exe를 소요하고 있으면 사점 복사 "

}

그러나 거기 4 taskmanager에서 robocopy 프로세스. cmd.exe 프로세스가 완료되면 커서는 label.text에 "Sucesssfully completed"를 반환합니다. 실행중인 robocopy 프로세스가있는 동안 복사 프로세스를 수행하는 robocopy 창이 보입니다. 복사 프로세스를 수행하는 robocopy 창을 볼 수 있습니다.

여기에 있습니다. 대열이다. stion : C#에서 모든 프로세스 (cmd.exe 및 robocopy.exe)의 contrl을 프로그램 적으로 가져 와서 label.text가 "모든 명령이 성공적으로 완료된 경우에만" GUI에는 아무런 의미가 없습니다.

옵션 2 (Biju가 위에서 작성한 것과 유사) : sample.cmd (배치 파일) 파일에서 robocoy 명령 스크립트를 제거하고 C#에서 4 개의 robocopy 행을 실행하는 코드를 작성하는 것이 좋지만 robocooy를 실행하는 방법 스크립트 행은 .cmd 파일로 작성되며 인수도 있습니다. 코드는 각 robocopy 프로세스를 실행 한 다음 각 코드 줄로 돌아가고 실패하면 오류를 catch하고 메시지 상자에 표시 할 수 있습니다.

희망이 도움이 될 것입니다. 그러나 누군가가 똑같이 향상시킬 수 있다면 더 좋은 방법을 찾고 있습니다. 고마워요 :)