Hallo Community
Habe folgendes Script für die ISO-Erstellung konzipiert:
DEMO-Script:
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=MKISOFS.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; AutoIt Version: 3.3
; Template Version: 90129
Opt("WinWaitDelay", 500)
Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon
Opt("MouseCoordMode", 0) ;1=absolute, 0=relative, 2=client
Opt("ExpandEnvStrings", 1) ;0=don't expand, 1=do expand
Opt("ExpandVarStrings", 1) ;0=don't expand, 1=do expand
Opt("WinDetectHiddenText", 0) ;0=don't detect, 1=do detect
Opt("WinTitleMatchMode", 1) ;1=start, 2=subStr, 3=exact, 4=advanced
Opt("WinTextMatchMode", 1) ;1=complete, 2=quick
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <Process.au3>
#include <File.au3>
$exe = "CMD.EXE"
$indir = "C:\TEST"
$outfile = "C:\TEST.ISO"
$fsinmb = "5000"
$savdrv = "C:"
$fspace = 10000
$isofertig = 4900
Example()
Local $outfile, $isofertig, $isoaktuell, $command, $exe, $delete, $indir, $fsinmb, $space, $savdrv, $fspace, $PID ;
;__________________________________________________________________________________________
Func Example()
; Local $outfile, $isofertig, $isoaktuell, $command, $exe, $delete, $indir, $fsinmb, $space, $savdrv, $fspace, $PID ;
Local $progressbar1, $button, $wait, $s, $msg, $m, $percent, $outsizeupd, $fs, $wtwf, $PID, $elc
; MsgBox(0 , "Info", " $savdrv = " & $savdrv & "")
$PID = ProcessExists($exe)
$delete = FileExists($outfile)
If $delete = 1 Then ; file exists
$fs = "YES"
Else
$fs = "NO"
EndIf
GUICreate("MKISOFS - PreMastering - 90327", 660, 160, 50, 500) ; erstellt GUI-Fenster so groß wie DOS-Box
$progressbar1 = GUICtrlCreateProgress(10, 45, 640, 20); Fortschrittsbalken
$button = GUICtrlCreateButton("START", 20, 110, 80, 30) ; erstellt START-Button ; ID = 4
GuiCtrlSetBkColor(-1, 0xFFFF00)
GUICtrlCreateLabel("Source: " & $indir & "", 20, 15) ; ID = 5
GUICtrlCreateLabel("File: " & $outfile & "", 20, 80) ; ID = 6
GUICtrlCreateLabel("File exists: " & $fs & "", 450, 80) ; ID = 7
GUICtrlCreateLabel("Size: " & $fsinmb & " MB", 300, 105) ; ID = 8
GUICtrlCreateLabel("Output: 0 MB", 288, 130) ; ID = 9
GUICtrlCreateLabel("Progress: 0 %", 135, 105) ; ID = 13
GUICtrlCreateLabel("Free Space on " & $savdrv & "\ = " & $fspace & " MB", 450 , 105) ; ID = 80
GuiCtrlSetBkColor(-1, 0x00CCCC)
GUISetState(@SW_SHOW) ; startet die GUI
$wait = 100 ; time in msec to next loop-step
Do ; Anfang der Schleife (= Anfang der progresssteps ?)
$msg = GUIGetMsg() ; fragt ob, und was geklickt wurde
If $msg = $button And GUICtrlRead($Button) <> "DONE" Then ; wenn button-click START
Run(@ComSpec)
WinWait("C:\WINDOWS\system32\cmd.exe")
WinMove("C:\WINDOWS\system32\cmd.exe", "", 50, 100)
GUICtrlSetData($button, "CANCEL"); ändert label des button in CANCEL
GuiCtrlSetBkColor(4, 0xFF6600)
For $i = 0 To 100 ; Schritte von 0 bis 100
$m = GUIGetMsg() ; fragt ob, und was geklickt wurde
If $m = -3 Then ExitLoop ; ???
If $m = $button Then ; wenn button-click CANCEL
ProcessClose($exe) ; beendet CMD
Exit ; beendet dieses Script
Else ; wenn button-click CANCEL nicht erfolgt
$delete = FileExists($outfile)
If $delete = 1 Then ; file exists then set electioncolor ($elc)
$fs = "YES"
$elc = "0x66FF33"
Else
$fs = "NO"
$elc = "0xFF0000"
EndIf
$PID = ProcessExists($exe)
$space = DriveSpaceFree( $savdrv )
$fspace = Round ($space, 2)
$isoaktuell = 950 + $i*40; prüft Dateigröße in kb
$outsizeupd = Round ($isoaktuell / 1024 / 1024, 2); prüft Dateigröße in MB
GUICtrlSetData($progressbar1, $isoaktuell/$isofertig*100) ; gibt die Position des Balkens vor
$percent = Round($isoaktuell/$isofertig*100)
GUICtrlCreateLabel("File exists: " & $fs & "", 450, 80)
GuiCtrlSetBkColor(-1, $elc)
GUICtrlCreateLabel("Progress: " & $percent & " %", 135, 105)
GUICtrlCreateLabel("Output: " & $percent & " kb", 289, 130)
GUICtrlCreateLabel("Free Space on " & $savdrv & "\ = " & $fspace & " MB", 450 , 105)
GuiCtrlSetBkColor(-1, 0x00CCCC)
GUICtrlCreateLabel(" cmd.exe PID = " & $PID & "", 450, 130) ; ID = 16
GuiCtrlSetBkColor(-1, 0xFF9966)
GUICtrlCreateLabel("Step Nr. = " & $i & "" , 400, 15) ; ID = 16
Sleep($wait) ; wartet vorgegebene Zeit
; $i = $percent
EndIf ; Ende der Bedingung
Next ; Weiter geht´s
#cs
If $i > 45 And $PID < 1 Then
GUICtrlSetData($button, "DONE"); ändert label des button in DONE
GuiCtrlSetBkColor(4, 0xFFFF00)
GUICtrlCreateLabel("Process finished.", 135, 130)
GuiCtrlSetBkColor(-1, 0x66FF33)
#ce
If $i > 100 Then
GUICtrlSetData($button, "DONE"); ändert label des button in DONE
GuiCtrlSetBkColor(4, 0xFFFF00)
GUICtrlCreateLabel("Process finished.", 135, 130)
GuiCtrlSetBkColor(-1, 0x66FF33)
EndIf ; Ende der Bedingung
ElseIf $msg = $button And GUICtrlRead($Button) = "CANCEL" Then
$msg = $GUI_EVENT_CLOSE
ElseIf $msg = $button And GUICtrlRead($Button) = "DONE" Then
ProcessClose($exe) ; beendet CMD
$msg = $GUI_EVENT_CLOSE
EndIf ; Ende der Bedingung
Until $msg = $GUI_EVENT_CLOSE ; bis Fenster geschlossen wird
EndFunc ;==>Example
;__________________________________________________________________________________________
Um mein Problem für Euch nachvollziehbar zu machen hab ich im "DEMO-Script" den eigentlichen Befehl durch ein blankes CMD-Fenster ersetzt.
- Wenn das Script gestartet wird bewegt sich der Fortschrittsbalken.
- Berechnet wird der Progress duch das Verhältnis von Source-Ordner zu fertiger Dateigröße. Wird im DEMO-Script natürlich nur simuliert.
Jetzt kommt im ECHTEN Script der Haken:
- mkisofs "spart" bis zu 15% Dateigröße durch Optimierung ein.
Dadurch bleibt der Progress, nach beenden von mkisofs, schon bei 85% stehen während das Script weiterarbeiten will.
Es lässt sich dann nicht mehr mit den GUI-Controls beenden, was denn wie ein Absturz des Programms wirkt.
- Ich wollte dann eine Formel einbauen, die im Falle von $PID = 0 dem Script suggeriert hätte daß $percent = 100 und somit das Ziel erreicht sei.
Da bin ich nicht mehr weitergekommen. Nach ZIGGG Versuchen muß ich Euch um Hilfe in der Angelegenheit bitten.
Bitte zeigt mir mit welchen Code-Zeilen ich die Möglichkeit hab, nach Beendigung von "mkisofs.exe" die Schleife zu beenden und den Prozentwert auf 100 zu setzen.
- Natürlich ist auch jede andere Problemlösung willkommen !
Gruß M.
PS. Wenn man wärend Ablauf des Scripts das CMD-Fenster schließt springt $PID zwar auf Null, aber im Hintergrund bleibt die letzte Ziffer der CMD.EXE-PID sichtbar.
- Wie kann man das korrigieren ?