none
Rückgabewert von Process in Batch auslesen HOWTO? RRS feed

  • Frage

  • Hallo Forum,

    ich habe hier eine kleine WinForms 2.0 Anwendung die ich folgender

    maßen starte: Also ohen Übergabeparameter wird die normale GUI gestartet und mit Übergabeparameter

    wird die nur der Übergabeparameter geparsed und eine 1 oder 0 zurückgegeben.

    Das klappt soweit alles, nur wie bekomme ich jetzt diese 0 oder 1 ausgelesen?

    Am besten per Batchdatei Beispeil im moment sieht das so aus:

     

    Gruß und TIA!

    Michael

    TestClientRuledJudge.exe "F.2\"test\" & \"test2\" & R\"[0-9]{1,5}\""
    
    pause
    

     

     

     

     /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static int Main(string[] args)
        {
          if (args.Length >= 1)
          {
            Classcon.DClassify.External.ChainRules.RuleParser parser = new Classcon.DClassify.External.ChainRules.RuleParser();
            bool returnValue = parser.CheckBracketSyntax(args[0]);
    
            string strReturn = "";
            strReturn = "Rule:'" + strReturn + "'Ergenis:'" + returnValue.ToString() + "'" + Environment.NewLine; 
    
            if (returnValue)
            {
    
              Console.WriteLine(strReturn);
              return 1;
            }
            else
            {
              Console.WriteLine(strReturn);
              return 0;
            }
            
            
          }
          else
          {
    
    
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
    
            return 1;
          }
    
          
        }
    

    Freitag, 3. Juni 2011 14:50

Antworten

  • Wenn du deine App in ner cmd.exe startest, kannst du den ErrorLevel auslesen. Der enthält den Returncode.

    @echo off
    my_nify_exe.exe
    if errorlevel 1 (
       echo Failure Reason Given is %errorlevel%
       exit /b %errorlevel%
    )

     

    Freitag, 3. Juni 2011 15:03
  • Hallo Michael,

    • ... bei mir ist es jetzt umgekehrt, spricht da etwas gegen wenn ich es so lasse?

    funktionieren tut es sicher, aber es ist eben - wie Du selber eigentlich auch schon beschrieben hast - unsystematisch.

    Am einfachsten kann man es hier evtl. mit dem "Principle_of_Least_Astonishment" (u.a. aus dem CleanCode) begründen, warum ein ErrorLevel 0 bei Erfolg sinnvoller ist:

         Wenn sich eine Komponente überraschenderweise anders
         verhält als erwartet, wird ihre Anwendung unnötig
         kompliziert und fehleranfällig.

    Das wird sicher später in Deinem Fall einen gewissen Zusatzaufwand darstellen können, wenn gegen den Standard implementiert wird, also:
    "Empfehlung" meinerseits: nimm ErrorLevel 0 für Erfolg.


    ciao Frank
    Samstag, 4. Juni 2011 08:11
  • Hallo Michael,

    Hab gehört das eigentlich 0 der Rückgabewert für alles OK ist [...]


    Aus der Dokumentation von Process.ExitCode:

    "Entwickler kennzeichnen eine erfolgreiche Beendigung üblicherweise durch einen ExitCode-Wert von 0 und Fehler durch Werte ungleich 0, anhand derer die aufrufende Methode den Grund für die nicht ordnungsgemäße Beendigung des Prozesses erkennen kann. Diese Richtlinien entsprechen der Konvention, auch wenn ihre Einhaltung nicht zwingend erforderlich ist."

    Aus der Dokumentation von Main()-Rückgabewerte:

    "Beim Ausführen eines Programms unter Windows wird ein evtl. von der Main-Funktion zurückgegebener Wert in einer Umgebungsvariablen mit dem Namen ERRORLEVEL gespeichert. Batchdateien können das Ergebnis der Ausführung bestimmen, indem sie die ERRORLEVEL-Variable überprüfen. In der Regel signalisiert ein Rückgabewert von 0 (null) die erfolgreiche Ausführung."

    Natürlich kann Dich niemand zwingen, diese Konvention zu befolgen, aber Generationen von Programmierern haben sich dran gewöhnt, dass ein Rückgabewert von 0 die Abwesenheit von Fehlern bedeutet und somit Erfolg. Das ist nicht nur unter Windows so, sondern auch unter Unix usw.

    Gruß
    Marcel

    Samstag, 4. Juni 2011 08:47
    Moderator

Alle Antworten

  • Wenn du deine App in ner cmd.exe startest, kannst du den ErrorLevel auslesen. Der enthält den Returncode.

    @echo off
    my_nify_exe.exe
    if errorlevel 1 (
       echo Failure Reason Given is %errorlevel%
       exit /b %errorlevel%
    )

     

    Freitag, 3. Juni 2011 15:03
  • Hallo Michael,

    ja, "Errorlevel" ist hier eine Möglichkeit, wenn man auf Batch-Ebene den Rückgabewert einer so implementierten C# Exe abfragen will.
    Hier noch einige Informationen dazu:

    [Galileo Computing :: Integrationshandbuch Microsoft-Netzwerk – 15.10 Exkurs zum Verständnis des Befehls »if errorlevel Zahl«]
    http://openbook.galileocomputing.de/microsoft_netzwerk/microsoft_netzwerk_15_009.htm#Rxxobkapitel15009040001421f03b132

    [Setlocal]
    http://msdn.microsoft.com/en-us/library/bb491001.aspx

    [Abfrage eines bestimmten ERRORLEVEL]
    http://support.microsoft.com/kb/504265/de


    ciao Frank
    Freitag, 3. Juni 2011 18:52
  • danke! das wars ;)

     

    die Test.bat sieht jetzt so aus.

    Klappt wunderbar, hab gehört das eigentlich 0 der Rückgabewert für alles OK ist,

    bei mir ist es jetzt umgekehrt, spricht da etwas gegen wenn ich es so lasse?

     

    Gruß und TIA

     

    Michael

    @echo off
     TestClientRuledJudge.exe "F.2\"test\" & \"test2\" & R\"[0-9]{1,5}\""
    
    if errorlevel 1 (
      echo Syntax ist OK. Rueckgabewert: %errorlevel%
    	pause
      exit /b %errorlevel%
     )
     
    if errorlevel 0 (
      echo ERROR Syntax ist NOK. Rueckgabewert: %errorlevel%
    	pause
      exit /b %errorlevel%
     ) 
    
    
    

    Samstag, 4. Juni 2011 04:16
  • Hallo Michael,

    • ... bei mir ist es jetzt umgekehrt, spricht da etwas gegen wenn ich es so lasse?

    funktionieren tut es sicher, aber es ist eben - wie Du selber eigentlich auch schon beschrieben hast - unsystematisch.

    Am einfachsten kann man es hier evtl. mit dem "Principle_of_Least_Astonishment" (u.a. aus dem CleanCode) begründen, warum ein ErrorLevel 0 bei Erfolg sinnvoller ist:

         Wenn sich eine Komponente überraschenderweise anders
         verhält als erwartet, wird ihre Anwendung unnötig
         kompliziert und fehleranfällig.

    Das wird sicher später in Deinem Fall einen gewissen Zusatzaufwand darstellen können, wenn gegen den Standard implementiert wird, also:
    "Empfehlung" meinerseits: nimm ErrorLevel 0 für Erfolg.


    ciao Frank
    Samstag, 4. Juni 2011 08:11
  • Hallo Michael,

    Hab gehört das eigentlich 0 der Rückgabewert für alles OK ist [...]


    Aus der Dokumentation von Process.ExitCode:

    "Entwickler kennzeichnen eine erfolgreiche Beendigung üblicherweise durch einen ExitCode-Wert von 0 und Fehler durch Werte ungleich 0, anhand derer die aufrufende Methode den Grund für die nicht ordnungsgemäße Beendigung des Prozesses erkennen kann. Diese Richtlinien entsprechen der Konvention, auch wenn ihre Einhaltung nicht zwingend erforderlich ist."

    Aus der Dokumentation von Main()-Rückgabewerte:

    "Beim Ausführen eines Programms unter Windows wird ein evtl. von der Main-Funktion zurückgegebener Wert in einer Umgebungsvariablen mit dem Namen ERRORLEVEL gespeichert. Batchdateien können das Ergebnis der Ausführung bestimmen, indem sie die ERRORLEVEL-Variable überprüfen. In der Regel signalisiert ein Rückgabewert von 0 (null) die erfolgreiche Ausführung."

    Natürlich kann Dich niemand zwingen, diese Konvention zu befolgen, aber Generationen von Programmierern haben sich dran gewöhnt, dass ein Rückgabewert von 0 die Abwesenheit von Fehlern bedeutet und somit Erfolg. Das ist nicht nur unter Windows so, sondern auch unter Unix usw.

    Gruß
    Marcel

    Samstag, 4. Juni 2011 08:47
    Moderator
  • Dann werde ich mal die Generationen von Programmierern,

    mal nciht enttäuschen und die Rückgtabewerte bei mir umdrehen ;)

     

    Gruß und dank für die vielen Antworten ;)

    Michael

    Samstag, 4. Juni 2011 16:50