Verzeichnisangabe bei Consolen-Programm-Ende anzeigen

  • Hallo Gemeinde,

    ein hoffentlich einfaches Prob:

    ich starte mein Programm im Consolen-Modus(CMD). Da steht dann im CMD-Fenster
    z.B. folgende Zeile:


    D:\folder>
    D:\folder>programm.exe

    Programmausgaben
    _


    Wenn nun das Programm fertig ist, dann blinkt da nur der Cursor(wie der Unterstrich oben). Ich hätte aber gerne analog wie bei verschiedenen Dos-Commandos, dass
    da auch wieder D:\folder>_ angezeigt wird. Könnte mir jemand einen Tipp geben wie ich das bewerkstellige...

  • hipfzwirgel

    Hat den Titel des Themas von „Verzeichnisangabe bei Consolen-Programm ende anzeigen“ zu „Verzeichnisangabe bei Consolen-Programm-Ende anzeigen“ geändert.
  • Wenn nun das Programm fertig ist, dann blinkt da nur der Cursor(wie der Unterstrich oben).

    Ob ein Script/Programm fertig ist, erkennst du daran, das der Prompt wieder angezeigt wird. Ist dies nicht der Fall, dann läuft da irgendwas schief... wenn du uns dein Script zeigst, können wir dir sicher auch sagen, woran es liegt.

  • Hallo Bitnugger,

    ich habe meinen Code nochmal angeschaut. Ich schließe das Proggi nach jedem Funktionsaufruf(z.B. D:\folder>programm.exe -b) per Exit.
    Die Exe wird auch im Taskmanager geschlossen.


    Könnte es damit zu tun haben, das ich in die Console per

    _WinAPI_AttachConsole()

    $hConsole = _WinAPI_GetStdHandle(1)

    die Ausgaben des Proggi per _WinAPI_WriteConsole in die Console schreibe?


    Sollte ich den Handle per _WinAPI_CloseHandle zusätzlich schließen anstatt nur ein Exit zu machen?

  • ich habe es mit dem folgenden Programm/Script getestet:



    Demnach liegt das Verhalten am _WinAPI-Code. Ohne diesen wird nach dem Ende des Proggis der Prompt angezeigt...

  • Demnach liegt das Verhalten am _WinAPI-Code.

    Dann versuch mal, die Konsole wieder freizugeben. Sollte man nach Möglichkeit immer tun, wenn man auf Systemressourcen zugreift.

    AutoIt
    Func _WinAPI_FreeConsole() ; returns true/false
    Local $aRet = DllCall("Kernel32.dll", "bool", "FreeConsole")
    If Not @error Then Return $aRet[0]
    EndFunc
  • Sollte ich den Handle per _WinAPI_CloseHandle zusätzlich schließen anstatt nur ein Exit zu machen?

    Wenn du dir das Handle mit Attach geholt hast, darfst du es nicht schließen, sondern musst es wieder freigeben, soweit ich es weiß.


    AutoIt
    Func _Console_Close()
    Local $vRet = DllCall("Kernel32.dll", "int", "FreeConsole")
    If @error Then Return SetError(1, 0, 0)
    Return SetError($vRet[0] <> 0, 0, $vRet[0])
    EndFunc ;==>_Console_Close


    Ohne ein lauffähiges (Minimal-)Script von dir, kann ich wenig sinnvolles zu deinem Problem sagen...

  • Hallo Bitnugger,

    in Antwort 6 habe ich doch den Code für ein script eingefügt. au3-Datei anbei. Ohne den Befehlsblock öffnet sich die MsgBox gibt das Ergebnis bekannt
    und wenn es geschlossen wird steht der Prompt in der Console. Mit dem Winapi-Code wird das Proggi beendet aber der Prompt bleibt weg.
    Es funktionieren zwar die Proggis, sieht aber blöd aus...

    Ich habe die Zeilen deiner Funktion Console_Close in meine Close-Funktion(mein OriginalProggi, nicht das Testproggi) eingefügt aber der Prompt kommt nicht.

  • Warum compilierst Du das Script nicht als CUI-Programm?

    Dann funktioniert ganz einfach ConsoleWrite:

  • Hallo Oscar,

    weil das Programm sowohl als Consolen-Programm als auch als GUI-Programm funktionieren soll. Damit es sowohl in Windows 10 als auch in unserer
    Windows-PE-Umgebung funktioniert...

    Arbeite ich dann nicht mit _WinAPI schreibt er mir die Ausgaben in eine extra Console, mit WinAPI fehlt am Schluss der Prompt;(

  • Ist ja in der Tat seltsam... aber so könntest du es 'fixen':