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.