Problem bei der Arbeit mit CMD

  • Hi,

    ich habe ein Problem bei der Verwendung von CMD.exe.

    Habe schon das Forum auf der Suche nach Tipps durchwühlt, aber nicht das Richtige gefunden. Ich glaube, mit „RunWait“ komme ich nicht weiter:

    Also, zum einen möchte ich eine Partition formatieren.

    Das ist grundsätzlich auch kein Problem.

    Folgendes Skript verwende ich dafür:


    $label = DriveGetLabel

    Run("cmd.exe")
    WinWait("C:\WINDOWS\system32\cmd.exe")CMD
    If Not WinActivate("C:\WINDOWS\system32\cmd.exe") Then WinActivate("C:\WINDOWS\system32\cmd.exe")
    EndIf
    WinWaitActive(("C:\WINDOWS\system32\cmd.exe")
    Send("Format E: /q /fs:NTFS /v:Programme")
    Sleep(500)
    Send("{ENTER}")
    Sleep(5000)
    Send( $label )
    Sleep(500)
    Send("{ENTER}")
    Sleep(5000)
    Send("j")
    Sleep(500)
    Send("{ENTER}")
    Sleep(60000)
    ProcessClose("cmd.exe")
    Exit


    Mit dem letzten Sleep-Befehl (60 Sekunden) kompensiere ich die Zeit, die nötig ist für die Formatierung. Denn erst dann kann der nächste Befehl ProcessClose("cmd.exe") eingegeben werden, um den aktuellen Vorgang abzuschließen.

    Genau da liegt mein Problem.

    Nach dem Start des Skriptes mit Run muss ich, nachdem CMD läuft, dort noch einige Befehle für die Formatierung eingeben. Dann läuft die Formatierung. Da das Fenster während der Formatierung weiter aktiv ist, würde ProcessClose die Formatierung vor Abschluss abbrechen. Ich suche nach einer Möglichkeit, mit AutoIt zu erkennen, wann der in CMD laufende Prozess beendet ist. Erst dann soll der nächste Befehl in CMD folgen.
    RunWait hilft mir hier nicht wirklich.

    Ich habe noch ein weiteres Prog (XP-Updater von der Chip-CD). Das Prog installiert mehrere Win-Updates. Nach dem Start müssen die Lizenzbedingungen bestätigt werden. Dann wird CMD durch das Prog gestartet und ein Update nach dem anderen wird installiert. Das dauert jedes Mal unterschiedlich lange. Nah der Instalation derUpdates muss eine beliebige Taste drücken, um CMD zu beenden.

    Das Skript dazu:

    Opt("WinWaitDelay",100)
    Opt("WinTitleMAtchMode"),4)
    Opt("MouseCoorMode",0)

    ; Start
    Run('XPUpdater.exe')

    ; Lizenzbedingungen
    WinWait("BITTE BEACHTEN SIE:", "Annehmen")
    If Not WinActivate("BITTE BEACHTEN SIE:", "Annehmen") Then WinActivate("BITTE BEACHTEN SIE:", "Annehmen")
    WinWaitActive("BITTE BEACHTEN SIE:", "Annehmen")
    Send("{SPACE}")

    ; Start der Update-Installation
    WinWait("C:\WINDOWS\system32\cmd.exe", "")
    If Not WinActivate("C:\WINDOWS\system32\cmd.exe", "") Then WinActivate("C:\WINDOWS\system32\cmd.exe", "")
    WinWaitActive("C:\WINDOWS\system32\cmd.exe","")
    Send("{SPACE}")

    ; Zeit zur Installation der Updates
    Sleep(720000)

    ; Abschluss der Update-Installation
    WinWait("C:\WINDOWS\system32\cmd.exe", "")
    If Not WinActive("C:\WINDOWS\system32\cmd.exe", "") Then WinActivate("C:\WINDOWS\system32\cmd.exe", "")
    WinWaitActive("C:\WINDOWS\system32\cmd.exe", "")
    Send("{SPACE}")
    Exit


    Es ist mir passiert, dass der letzte Befehl zu früh kam und daher ins „Leere“ ging. Als Folge blieb CMD geöffnet während sich bereits das nächste Skript öffnete.

    Mir fiel nichts anderes ein, als die Sleep-Zeit sehr großzügig zu verlängern, was aber höchstens sub-optimal ist, zumal das die Gesamtzeit meiner unbeaufsichtigten Windows-Installation mit Programmen unnötig verlängert.


    Meine Frage ist, ob es eine Möglichkeit gibt, mit AutoIt zu prüfen, wann der Prozess (die Formatierung bzw. die Installation aller Updates) beendet ist, um direkt danach den letzten Befehl (Send(„{ENTER}“) bzw. ProcessClose(„CMD.exe“) auszuführen.

  • Hi,

    ein entsprechender Parameter würde das Problem beim Formatieren natürlich lösen.

    Ich kenne aber leider keine Parameter, die das Formatieren unbeaufsichtigt ablaufen lassen. In der ntcmds.chm habe ich keinen entsprechenden Parameter gefunden.


    Aber nicht meine grundsätzliche Frage:

    Gibt es bei AutoIt eine Möglichkeit, in der CMD.exe zu überprüfen, ob der dort laufende Prozess noch läuft oder ob er beeits beendet ist?

    Gibt es eine Alternative zu den groben Schätzungen für die Sleep-Befehle in den o.a. Skripten?

  • Probiere mal folgende heran gehensweise.

    Leite einfach die Ausgabe des Formatbefehls in eine Textdatei um.

    Somit bist du jetzt in der Lage die Daten in dieser Datei auszuwerten und entsprechende Handlungen auszuführen.

  • Hi,
    also für das Formatieren hätte ich da noch einen Vorschlag welcher Dir vielleicht weiterhilft:

    [autoit]


    $fh=FileOpen(@ScriptDir & "\answ.txt",1)
    FileWrite($fh,@CRLF) ;Einmal die "EINGABETASTE" mitgeben,damit die Abfrage gleich bestätigt wird...
    FileClose($fh)
    Runwait(@ComSpec & " /c format.com a: /q /V:A <" & @ScriptDir &"\answ.txt",@SystemDir,@SW_HIDE)
    FileDelete(@ScriptDir & "\answ.txt")

    [/autoit]

    eddy_erpel

  • Hi,

    Danke für die Tipps. Melde mich, wenn ich sie durchgearbeitet habe.

    Gruß Tom

    Einmal editiert, zuletzt von Onkel-tom (28. Dezember 2006 um 15:48)

  • Hi,

    sorry, dass ich so lange nicht geantwortet habe.
    Jetzt habe ich endlich wieder mehr Zeit, um mich den wirklich wichtigen Dingen des Lebens (AutoIt..grins) zu widmen...


    Also zu meinem Thema:

    Das Problem mit dem Update-Pack habe ich auf einem anderen Weg gelöst.
    Ich habe das Update-Pack wie ein "normales" Update integriert.

    Für mein Problem beim Formatieren habe ich keine Lösung gefunden.

    Den Vorschlag von Eddy_Erpel habe ich in allen möglichen Varianten ausprobiert. Die Textdatei wird auch angelegt, aber ich habe es nicht einmal geschafft, auf diesem Weg eine Diskette zu formatieren.

    Die Hinweise von peethebee zum Befehl StdOutRead und von mausilein (Leite einfach die Ausgabe des Formatbefehls in eine Textdatei um.) kann ich leider nicht umsetzen. Offensichtlich reichen meine AutoIt-Kenntnisse dafür nicht aus. Habe versucht, es nachzuvollziehen. Aber wenn ich ehrlich bin, bin ich da deutlich überfordert.

    Vielleicht kann mir da noch jemand gezielt auf die Sprünge helfen.


    Gruß Tom

    • Offizieller Beitrag

    Hallo!

    Früher gab es den (nicht veröffentlichen) Parameter /y der dafür sorgte das man das Formatieren ohne die Sicherheitsabfrage durchführen konnte. Probiers doch mal damit vllt. geht der ja immer noch!

  • Bingo!!!

    Das ist genau das, was ich gesucht habe.

    Mit dem Befehl


    RunWait(@ComSpec & " /c " & "Format E: /y")


    erreiche ich genau das, was ich haben wollte.

    Die Partition wird formatiert und direkt anschließend wird CMD.exe beendet.


    Meine eigentliche Frage hinsichtlich CMD bleibt zwar unbeantwortet, aber dafür habe ich für mein Problem endlich eine gute Lösung gefunden.

    Endlich kann ich mein Skript mit der geschätzten Pause (Sleep) ausmustern.

    Besten Dank.


    Gruß Tom