Batchdatei ausführen (mit Rückgabewert)



  • Hallo

    Wie kann ich eine Batchdatei ausführen ?
    Wichtig ist dabei das die Batchdatei auch einen Errorlevel zurück bekommen kann.
    Wie könnte ich den dann auswerten ?
    Ich hab einige Ansätze gefunden aber entweder wird der Errorlevel ignoriert oder aber es wird
    mit "C:\\Windows\\system\\cmd.exe" etc gerabeitet. Aber was ist wenn ich nicht weiß wo Windows installiert ist ?
    Winnt, Windows ,Win32, MyWindowsVerzeichnis ?

    Gruß
    Martin



  • mach mal
    echo %ComSpec%
    den rest deine frage hab ich leider nicht verstanden.



  • Das system32-Verzeichnis sollte üblicherweise sowieso in der PATH-Umgebungsvariable stehen, so dass du die cmd.exe ohne Pfadangabe ausführen kannst.



  • Ok dann noch mal 🙂 ..
    Also ich will mir ein kleine Exe schreiben (Win32) die eine Batchdatei startet.
    Diese Batchdatei liefert ein Ergebnis zurück. Ist durchgelaufen oder es hat etwas nicht geklappt.
    Abhängig davon möchte ich mit meinem Programm weiter machen oder abbrechen. Daher muss ich den
    ErrorLevel auswerten. Wie mache ich das ?

    Ok cmd.exe kann ich dann einfach so starten... daran hab ich nicht gedacht 😮
    Aber wie bekomme ich den Errolevel zurück ?
    CreateProcess z.b läuft asynchron und leifert nur zurück, dass der Prozess gestartet wurde .. Aber das Ende und der Return--wert ?

    Gruß



  • martin_zi schrieb:

    CreateProcess z.b läuft asynchron und leifert nur zurück, dass der Prozess gestartet wurde .. Aber das Ende und der Return--wert ?

    nicht zwingend - der letzte parameter von CreateProcess() ist eine struktur, in dem nach dem start ein handle auf den neuen process enthalten ist. du kannst dann mit WaitForSingleObject() auf diesen "handle" warten, also mit anderen worten, du weisst wann er beendet ist.

    zum thema errorlevel - eine möglichkeit wäre, dein process schreibt in stderr welche du beim CreateProcess() über eine pipe umleitest und vom aufrufenden process ausliest.



  • Hi

    Ok du hast Recht.

    Aber als Beispiel:

    STARTUPINFO          si = { sizeof(si) };
    PROCESS_INFORMATION  pi;
    TCHAR                szExe[] = "cmd.exe";
    TCHAR                szParam[] = "/c mybat.bat";
    
    if(CreateProcess( szExe, szParam,0, 0, FALSE, 0, 0, 0, &si, &pi))
    {
    	WaitForSingleObject(pi.hProcess, INFINITE);
    
    	CloseHandle(pi.hProcess);
    	CloseHandle(pi.hThread);
    }
    

    Laut MSDN:
    http://msdn.microsoft.com/en-us/library/ms682425.aspx
    Steht da:
    "To run a batch file, you must start the command interpreter; set lpApplicationName to cmd.exe and set lpCommandLine to the following arguments: /c plus the name of the batch file."

    Wenn ich das aber mache geht es nicht ?? Bzw CreateProzess wird nicht gestartet.
    Hab ich da was übersehen ?
    Wenn ich nämlich ohne cmd.exe notepad.exe starte geht es ?? 🙄


Log in to reply