*.bat datei aus quellcode ausführen



  • Hallo,
    ich erstelle mittels eines C++ Codes eine Batch Datei die eine Makefile aufruft. Jetzt möchte ich aus meinem Quellcode diese Batchdatei ausführen, damit der User nix mehr machen muss. Danach soll auch die Batch als auch das MAkefile wieder entfernt werden, damit nur die mit dem MAkefile erzeugte Datei bestehen bleibt. Mit Open() komm ich irgendwie nicht weiter, da es nur den Read, Write und Create Modus gibt, aber keine Execute.

    Danke 👍



  • Such mal nach ShellExecute() und Konsorten 😉

    umd das Aufräumen kann sich die Batch-Datei auf Wunsch sogar selber kümmern - schreib' einfach ans Ende:

    del [i]makefile[/i]
    del %0.bat
    


  • Danke für die Antwort. Eine Frage. Folgender Code:

    CString IncludePath;
    
        CFileDialog m_File(TRUE);
    
        if(m_File.DoModal()==IDOK)
            m_strInclude = m_File.GetFolderPath();
    
        SetDlgItemText(IDC_INCLUDE, m_strInclude);
    

    Nach einem Klick auf einen Button des Users, soll sich das Öffnendialog öffnen. Der User kann nun seine zusätzlichen Abhängigkeiten (wird für die Batch Datei benötigt) auswählen. Diese soll dan in ein Listfeld übernommen werden. Wenn ich diesen Code ausführe kommt diese Fehlermeldung:

    Debug Assertion Failed!
    
    Program:...
    File: dlgfile.cpp
    Line:308
    
    For Information on how you program can cause an assertion
    failure, see the Visual C++ documentation on asserts.
    

    Und:

    ...exe" wurde mit Code 3 (0x3) beendet.
    

    Wenn ich in die Variable GetFileName lade bekomme ich den Namen. Ich brauche aber den Pfad für die Batch.

    Danke



  • Geht das ein bisschen genauer? Welche deiner Anweisungen verursacht die Assertion (und welche)?



  • Ja, sorry. Also in diesem Abschnitt:

    CString IncludePath;
    
        CFileDialog m_File(TRUE);
    
        if(m_File.DoModal()==IDOK)
            m_strInclude = m_File.GetFolderPath();
    
        SetDlgItemText(IDC_INCLUDE, m_strInclude);
    

    ist Zeile 6 Fehlehaft. Wenn ich dort den Wert GetFileName() angebe übernimmt er den Dateinamen. Aber GetFolderPath() erzeugt eine Assertion und zwar diese:

    ASSERT(::IsWindow(m_hWnd));
    

    Ich benötige aber den Pfad und nicht den Namen.



  • Oder kann ich das auch anders lösen? Ich habe einen Button mit der Überschrift "...". Bei klick auf diesen soll ein Dialog aufgehen, indem der User einen Ordner auswählen kann. Der Pfad dieses Ordners benötige ich für die Batch Datei, als zusätzliche Abhängigkeiten. Ich habs (wie oben zu sehen) über m_File.DoModal versucht, aber ich kann dort den Ordnerpfad nicht in meine Eingabefeldvariable schreiben. Für andere Lösungsansätze bin ich auch dankbar. 👍

    Desweiteren verstehe ich dies nicht:

    // Deklaration
    CStdio SaveFile;
    CString strFileName = "C:\Dokumente und Einstellungen\...\test.txt";
    
    // Datei erstellen und mit der Option schreiben öffnen
    SaveFile.Open(strFileName, CFile::modeCreate | CFile::modeWrite);
    SaveFile.WriteString("Test");
    SaveFile.Close();
    

    Beim Ausführen kommt nun Debug Assertion Failed!

    ASSERT(m_pStream != NULL);
    

    Verstehe diese Fehlermeldung nicht. m_pStream soll ja auch einen Inhalt haben der in die Datei test.txt geschrieben wird.



  • Weiß niemand was ich falsch mache? Ich komme nicht wirklich dahinter! 😡



  • abrissbirne schrieb:

    Desweiteren verstehe ich dies nicht:

    CString strFileName = "C:\Dokumente und Einstellungen\...\test.txt";
    

    Ungültig aufgebauter Pfad!!!
    1. Du musst die \ doppeln oder einen normalen Schrägstrich benutzen und
    2. was sollen die drei Punkte in dem Pfad???



  • jencas schrieb:

    abrissbirne schrieb:

    Desweiteren verstehe ich dies nicht:

    CString strFileName = "C:\Dokumente und Einstellungen\...\test.txt";
    

    Ungültig aufgebauter Pfad!!!
    1. Du musst die \ doppeln oder einen normalen Schrägstrich benutzen und
    2. was sollen die drei Punkte in dem Pfad???

    Nein, das war nur ein Beispiel. Ich benutze doppelte Schrägstriche. Eigentlich durchsuche ich den Rechner nach einem Pfad und schreibe diesen in eine CString Variable. Wenn ich das Ganze mit GetCommandLine mache funktioniert es, aber ich will die Datei nicht im Pfad der Anwendung ablegen. Und kaum hab ich einen anderen Pfad funzt dat nicht mehr. Hab beim Debuggen mal die Pfadvariable beobachtet und das Stimmt soweit auch. Ich weiß nicht was hier falsch läuft. Danke



  • Keine Ahnung was ich geändert habe, aber jetzt funktionierts. Neues Problem macht sich dafür auf. Ich bin soweit, dass ich ein Batch Programm und ein Makefile erzeuge und in dem Pfad des angegebenen .cpp Files abspeichere. Ich führe das Batch Programm aus, diese wiederum öffnet mein makefile. Aber es kommt immer eine Fehlermaldung. Wenn ich die Batch und das make im Windows Editor von Hand zu Fuss eintippe funktionierts. Jetzt meine Frage. Ist es falsch mein Batch und mein makefile in ein CString zu schreiben und dann als *.bat bzw makefile abzuspeichern? Gibt es da irgendwelche kompatibilitätsprobleme?

    So erstelle ich die Dateien:

    // Aussschnitt aus Quellcode
    strmakeBAT = "@echo off\r\n";
    strmakeBAT += "path %path%;" + strPath;
    strmakeBAT += "\r\ncall vcvars32\r\n";
    strmakeBAT += "nmake /f makfile";
    
    SaveFile.Open(strPath += "\\make.bat", CFile::modeCreate | CFile::modeWrite);
    SaveFile.WriteString(strmakeBAT);
    SaveFile.Close();
    

    Makfile wird genauso erzeugt.
    Ich führe die Batchdatei noch nicht über ShellExecute aus um das noch selbst in der shell einzugeben und zu kontrollieren ob es geht. Shell zeigt dies an:

    Setting environment for using Microsoft Visual C++ tools.
    
    Microsoft (R) Program Maintenance-Dienstprogramm: Version 6.00.8168.0
    Copyright (C) Microsoft Corp 1988-1998. Alle Rechte vorbehalten.
    
    makefile(3) : fatal error U1035: Syntaxfehler: ':' oder '=' Trennzeichen erwartet
    Stop.
    

    Die Batch und das makefile müssen stimmen, da es wie eben erwähnt von Hand zu Fuß ohne Probleme das macht was es soll. Danke für eure Hilfe! 👍


Anmelden zum Antworten