Dateien installieren+Status

  • Ich möchte einen kleinen Installer machen mit autoit...
    also möchte ich alle dateien von einem ordner in einen anderen kopieren und wärenddessen ein MS-Like Statusbar anzeigen, damit man sieht wie weit es schon ist und wieviel noch zu tun ist. wie geht das?

    bin für alle ideen dankbar

    • Offizieller Beitrag

    Hi,

    hier eine Möglichkeit:

    Spoiler anzeigen
    [autoit]

    ;~ 4 Do not display a progress dialog box.
    ;~ 8 Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists.
    ;~ 16 Respond with "Yes to All" for any dialog box that is displayed.
    ;~ 64 Preserve undo information, if possible.
    ;~ 128 Perform the operation on files only if a wildcard file name (*.*) is specified.
    ;~ 256 Display a progress dialog box but do not show the file names.
    ;~ 512 Do not confirm the creation of a new directory if the operation requires one to be created.
    ;~ 1024 Do not display a user interface if an error occurs.
    ;~ 2048 Version 4.71. Do not copy the security attributes of the file.
    ;~ 4096 Only operate in the local directory. Don't operate recursively into subdirectories.
    ;~ 9182 Version 5.0. Do not copy connected files as a group. Only copy the specified files.

    [/autoit] [autoit][/autoit] [autoit]

    _FileCopy("c:\Downloads\Systemsoftware_INSTALL\Windows Updates\WindowsXP-KB835935-SP2-DEU.exe" ,"C:\")

    [/autoit] [autoit][/autoit] [autoit]

    Func _FileCopy($fromFile,$tofile)
    Local $FOF_RESPOND_YES = 16
    Local $FOF_SIMPLEPROGRESS = 512
    $winShell = ObjCreate("shell.application")
    $winShell.namespace($tofile).CopyHere($fromFile,$FOF_RESPOND_YES)
    EndFunc

    [/autoit]

    2te:

    Spoiler anzeigen
    [autoit]

    ;Copy with Progressbar
    #Include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _copyProgress("c:\Downloads\Musik\Hütten Charts 2005\CD 1", "c:\Downloads\AutoIt-Skripte\Entwicklung\ForumTests\Mp3Test")

    [/autoit] [autoit][/autoit] [autoit]

    Func _copyProgress($From_dir, $Dest_dir, $filter = '*.*')
    Local $count = 0, $dir = ""
    $FileList = _FileListToArray($From_dir, $filter, 0)
    If (Not IsArray($FileList)) And (@error = 1) Then SetError(-1)
    ProgressOn("Copy", "Files :", "0 files")
    For $i = 1 To UBound($FileList) - 1
    If FileGetAttrib($FileList[$i]) = "D" Then $dir = "\*.*"
    If FileCopy($From_dir & "\" & $FileList[$i] & $dir, $Dest_dir & "\", 9) Then
    $count += 1
    ProgressSet($count * 100 / $FileList[0], _
    "From: " & $From_dir & "\" & @LF & "To: " & $Dest_dir & "\" & @LF & $FileList[$i], _
    Round(($count * 100 / $FileList[0]),2) & " % " & @TAB & $count & "/" & $FileList[0] & " Done")
    EndIf
    Next
    ProgressSet(100, "Done", "Complete")
    Sleep(500)
    ProgressOff()
    Return 1
    EndFunc ;==>_copyProgress

    [/autoit]

    So long,

    Mega

    • Offizieller Beitrag

    Oder, wenn du das Kopier-Avi dabei haben möchtest:

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    Dim $arFiles[100] ; zu kopierende Dateien
    For $i = 0 To 99
    $arFiles[$i] = "Datei " & $i ; nur als Muster
    Next
    $Form1 = GUICreate("Kopieren von Dateien . . .", 343, 194, -1, -1, $WS_CAPTION, $WS_EX_TOPMOST)
    $n1=GUICtrlCreateAvi (@SystemDir & "\shell32.dll",160, 40,20)
    GUICtrlSetState ($n1, 1)
    $Label = GUICtrlCreateLabel("", 70, 93, 203, 17, $SS_CENTER)
    $status = GUICtrlCreateProgress(20, 120, 303, 17 ,$PBS_SMOOTH)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    For $i = 0 To UBound($arFiles)-1
    ;Kopieren.. FileCopy( )
    GUICtrlSetData($Label, $arFiles[$i])
    GUICtrlSetData($status, Round(100/UBound($arFiles)*$i))
    Sleep(50)
    Next
    Exit
    WEnd

    [/autoit]


    Kannst du natürlich noch um die Anzeige der Prozentzahl erweitern.

  • hab ne funktion geschrieben um rekursiv alle dateien zu ermitteln

    wer braucht:

    Spoiler anzeigen
    [autoit]

    Func _makecopylist($dir, $filter = '*.*')
    $FileList = _FileListToArray($dir, $filter, 0)
    If (Not IsArray($FileList)) And (@error = 1) Then SetError(-1)
    _ArrayDelete($FileList,0)
    $i = 0
    While ($i < UBound($FileList))
    If FileGetAttrib($dir&'\'&$FileList[$i]) = "D" Then
    $tmp = _makecopylist($dir & '\' & $FileList[$i], $filter)
    $tmpdir=$FileList[$i]&'\'
    _ArrayDelete($FileList, $i)
    For $j = 0 To UBound($tmp) - 1
    _ArrayInsert($FileList, $j + $i, $tmpdir & $tmp[$j])
    Next
    $i = $i + UBound($tmp) - 1
    EndIf
    $i=$i+1
    WEnd
    Return $FileList
    EndFunc ;==>_makecopylist

    [/autoit]
  • Zitat

    Original von Flamefire
    Ich möchte einen kleinen Installer machen mit autoit...
    also möchte ich alle dateien von einem ordner in einen anderen kopieren und wärenddessen ein MS-Like Statusbar anzeigen, damit man sieht wie weit es schon ist und wieviel noch zu tun ist. wie geht das?

    bin für alle ideen dankbar

    OK du weisst, dass du via AutoIt Dateien in dein Programm einbinden kannst und diese auf dem Zielrechner in einen definierten Ordner "reininstallieren" kannst?
    Ich denke, dass die Funktion (die sich übrigends FileInstall() nennt) für deine Verwendungszwecke besser geeignet ist.....

    • Offizieller Beitrag
    Zitat

    Ich denke, dass die Funktion (die sich übrigends FileInstall() nennt) für deine Verwendungszwecke besser geeignet ist.....


    Und falls es mal ein paar Dateien mehr sind, kannst du dir das Script auch automatisch mit dem Install-Script-Generator erstellen lassen.

  • danke aber das kann ich nicht gebrauchen ^^
    meine "paar" dateiein sind insgesammt 1,5 GB groß
    mit FileInstall das in die Autoit exe reinzupacken wäre quatsch...

    mein problem: ein paar der dateien sind >100mb-->kopieren dauert->grafik hängt

    wie kann ich das umgehen? es sieht immer aus, als wäre das prog abgestürzt

    Einmal editiert, zuletzt von Flamefire (9. April 2007 um 18:29)

    • Offizieller Beitrag

    Ich befürchte, mit AutoIt-Mitteln gar nicht.
    AutoIt kann nicht mehrere Prozesse parallel laufen lassen. Es wird alles nacheinander abgearbeitet. Also Kopiervorgang wird gestartet und erst wenn er vorbei ist, kannst du eine neue Aktion starten.
    Ich hatte es bisher nicht gefunden, aber vielleicht läßt sich doch irgendwie vorher die 'Eieruhr' starten und am Ende des Vorgangs wieder schließen.

  • Oder du baust dir per AdlibEnable() eine Funktion welche ständig eine Aktivität anzeigt.

    Mal als Beispiel wie ich das meine (kannst statt SplashText ja auch einfach den Text deiner Progressbar entsprechend verändern lassen):

    [autoit]

    HotKeySet("{Esc}", "raus")

    [/autoit][autoit][/autoit][autoit]

    SplashTextOn("Test", '', 25, 25, -1, -1, 1)
    $Splash = WinGetHandle("Test", '')

    [/autoit][autoit][/autoit][autoit]

    AdlibEnable("_Beispiel", 150)

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(1000)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func _Beispiel()
    Dim $Test[4] = ['|','/', '-', '\']

    For $i = 0 To 3
    ControlSetText($Splash, '', "Static1", $Test[$i])
    Sleep(150)
    Next
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func raus()
    Exit
    EndFunc

    [/autoit]

    Ansonsten denke ich das es auch möglich wäre bei großen Dateien stückweise weiterzugehen.
    Wenn man die Gesamtgröße der Datei hat und eine Angabe wieviel von dieser schon kopiert wurden ist (z.B. in dem man die Größe im Zielverzeichnis checkt), dann könnte man dies wieder über AdlibEnable paralell zum Kopiervorgang abarbeiten lassen.

  • Tagchen nochmal
    GAAANZ großes Problem:
    hab das ganze erst mal mit diesem Stocken fertig und funktioniert auch wunderbar von Festplatte aus

    Jetzt hab ich das Din samt dem zu kopierenden Ordner auf ne CD gebrannt und es geht nicht mehr:
    er kopiert die Ordner als Dateien

    also ich hab nen Ordner "support" und statt er nen Ordner "support" im Zielverzeichnis erstellt und die Dateien aus dem Quellverzeichnis da rein kopiert erstellt er eine Datei "support" ohne Endung mit einem Teil aus den Dateien die da drin gewesen wären...
    Was soll das?

    Der relevante Code dürfte meine Funktion sein:

    Spoiler anzeigen
    [autoit]

    Func _makecopylist($dir, $filter = '*.*')
    $FileList = _FileListToArray($dir, $filter, 0)
    If (Not IsArray($FileList)) And (@error = 1) Then SetError(-1)
    _ArrayDelete($FileList,0)
    $i = 0
    While ($i < UBound($FileList))

    [/autoit] [autoit][/autoit] [autoit]

    If FileGetAttrib($dir&'\'&$FileList[$i]) = "D" Then
    $tmp = _makecopylist($dir & '\' & $FileList[$i], $filter)
    $tmpdir=$FileList[$i]&'\'
    _ArrayDelete($FileList, $i)
    For $j = 0 To UBound($tmp) - 1
    _ArrayInsert($FileList, $j + $i, $tmpdir & $tmp[$j])
    Next
    $i = $i + UBound($tmp) - 1
    EndIf
    $i=$i+1
    WEnd
    Return $FileList
    EndFunc ;==>_makecopylist

    [/autoit]


    Diese Funktion gibt schonmal nur die Ordner statt den Dateien daraus zurück...er scheint zu glauben es wäre eine...

    Kopieren tu ich das mit FileCopy()
    wenn ich der nen Ordner übergebe müsste der doch auch den Ordner samt Datein darin kopieren oder?

    AspirinJunkie: das brauch ich ja gar nicht...es geht ja darum, dass die Grafik stehen bleibt, wärend eine große Datei kopiert wird...das mit der Prozentanzeige ist eigendlich egal, da diese erst nach der DFatei geändert wird.

    Einmal editiert, zuletzt von Flamefire (12. April 2007 um 16:54)

  • Hi! Also einen Ordner kopiert man mit Dircopy!
    Naja ich denke wenn die Funktion ja funktioniert kann es daran garnet liegen!
    Hättest vlt mal die Kopiefunktion senden sollen^^
    Nja hoffe konnte helfen!

    Schönen Tag noch!

  • Hm - ziemlicher Denkfehler meinerseits. :hammer:

    Bin davon ausgegangen das mit AdlibEnable die angegebene Funktion unter allen Umständen immer nach dem angegebenen Zeitintervall aufgerufen wird.
    Ist aber, wie ich grad festgestellt habe aber leider doch nicht der Fall.
    Während z.B. eine FileCopy-Aktion läuft wird die Adlib-Funktion nicht während dessen aufgerufen ;(
    Wär auch zu schön gewesen...

    Was die Sache mit deinem jetzigen Problem angeht:
    Die Funktion zum rekursiven Auslesen der Dateien funktioniert bei mir eigentlich problemlos (bis auf das sie etwas langsam ist aber das hängt mit den _Array... Befehlen zusammen).

    Das Problem scheint also doch eher dann bei der Kopierfunktion zu hängen.

  • nja die Funktionen (auch die kopierfunktion) gehen ja beide...
    aber nur solange ich das auf der festplatte mache...sobald ich ich das von CD aus mache wirds Mist...er scheint ne zu erkennen dass es ein Ordner ist

    also da man verzeichnisse mit dircopy macht, müsste der fehler ja eigendlichschon in der fkt makecopylist liegen...da müsste er ja aus nem Ordner die dateien suchen

    ichglaube ich habs:
    ich muss
    If FileGetAttrib($dir&'\'&$FileList[$i]) = "D"
    ersetzen durch
    If StringInStr(FileGetAttrib($dir&'\'&$FileList[$i]) "D")

    dann müsste es gehen...
    das verzeichnis auf einer CD dürfte ja "RD" sein ^^
    oder schonmal versucht auf ner CD zu schreiben? man bin ich dumm ^^

    Einmal editiert, zuletzt von Flamefire (12. April 2007 um 17:56)

  • Das hängt damit zusammen weil Ordner auf der CD schreibgeschützt sind.
    Das bedeutet das sie zusätzlich zum Attribut "D" noch "R" besitzen.
    Du musst also deine entsprechende Abfrage umbauen - z.B. so:

    [autoit]

    If StringInStr(FileGetAttrib($dir&'\'&$FileList[$i]), "D") Then

    [/autoit]

    Hm - mal wieder zu spät :weinen:

    Einmal editiert, zuletzt von AspirinJunkie (12. April 2007 um 17:58)

  • :schild4:

    ^^
    trotzdem danke...das kommt avon wenn man scripte übernimmt und nicht nochmal prüft ^^

    hmm bleibt trotzdem noch die Frage, wie man die Grafik dazu bringt, sich weiter zu bewegen...
    eine idee wäre für jede größere datei eine tmp batch zu schreiben und zu starten...aber das wäre quatsch...

    Einmal editiert, zuletzt von Flamefire (12. April 2007 um 19:39)

  • HI!

    :hm: Eine Möglichkeit wäre doch, eine 2. exe zu includen, die das kopieren über Parameter übernimmt! d.h du baust dir ne exe, die auf parameter reagiert so hier die 2.exe

    [autoit]


    ;Der Parameter setzts sich wie folgt zusammen: "Der Ordner oder die Datei | Das Ziel | 1 Für Datei oder 0 für Ordner"
    If $Cmdline[0] = 0 Then Exit
    $Para = $Cmdline[1]
    $Para = StringSplit($Para,"|")
    If $Para[3] = 0 Then
    DirCopy($Para[1],$Para[2],1)
    ElseIf $Para[3] = 1 Then
    FileCopy($Para[1],$Para[2],9)
    EndIf

    [/autoit]


    Gehen wir mal davon aus die .exe Copy.exe heißt dann ruft man die so auf:

    [autoit]

    Shellexecute("Copy.exe","C:\Programme\AutoIt3\Aut2Exe|C:\|0")
    while Processexists(Copy.exe)
    ; was noch geschehen soll.......
    ;......
    wend

    [/autoit][autoit][/autoit][autoit][/autoit]


    Dann überprüfst du in deinem script mit processexist(copy.exe) ob die die exe noch läuft wenn nicht mehr dann machste weiter! währenddessen kannst du ja auch deine Grafik updaten!