Multi-Download-Tool (MDT)

    • Offizieller Beitrag

    Dieses Programm bietet die Möglichkeit mehrere Programme zum Download anzubieten. Der Benutzer kann dann auswählen, welche Programme er downloaden möchte und nach einem Klick auf den Start-Button werden alle Programme nacheinander heruntergeladen und in ein vorher festgelegtes Zielverzeichnis gespeichert.
    Das festlegen, welche Programme zum Download angeboten werden, geschieht mittels einer Inidatei, die folgendermaßen aufgebaut ist:

    Spoiler anzeigen

    Das abbrechen einzelner Downloads kann mit der [ESC]-Taste vorgenommen werden. Zum abbrechen aller Downloads steht die Tastenkombination [ALT]+[ESC] zur Verfügung.
    Im Kontexmenu des Listviews gibt es die Möglichkeit alle/keine Programme auszuwählen.

    Version 1.3 ( 05.08.2014 )
    - Diese Version funktioniert jetzt auch mit der aktuellen Version (v3.3.12.0) von AutoIt.

    Screenshot:
    autoit.de/wcf/attachment/6066/

  • Hallo osca!


    Super ide und ist richtig schön geworden!


    Ich möcht noch was zu dein Computer-Info code sagen, ich bin richtig wow muß ich sagen denn weil ich gerade an ein code arbeite Admin-Tool und würde gerne so manche sachen verwenden nur leider habe ich noch nicht das verständiss für die ganzen funktionen, aber das kommt schon!


    LG Kleiner

    • Offizieller Beitrag

    Wenn der Download starten Button auch mal erscheinen würde, könnte man auch den Download starten. :whistling:

    • Offizieller Beitrag

    Nein ist es nicht, sonst hätte ich es ja nicht geschrieben.

  • Hey Oscar. Sehr schön Dein Script. Kann ich bestimmt bei der nächsten Neuinstallation gebrauchen. Dann muss ich nicht mehr die ganzen Downloadseiten zusammensuchen. :D

    Ich hab da mal eine kleine Zusatzfunktion eingebaut. Die Datei, die gerade heruntergeladen wird, ist in der ListView Rot markiert.
    Habs aber nicht ganz fertig gestellt. Sollte ja nur eine Anregung sein :D.

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=prog.ico
    #AutoIt3Wrapper_Outfile=MDT.exe
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Res_Description=MultiDownloadTool
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.0
    #AutoIt3Wrapper_Res_LegalCopyright=by Oscar (http://www.autoit.de)
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_Run_Obfuscator=y
    #Obfuscator_Parameters=/striponly
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <EditConstants.au3>
    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <StaticConstants.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <String.au3>
    #include <Array.au3>
    Opt('GUIOnEventMode', 1)
    Opt('GUICloseOnESC', 0)

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

    Global $sTitle = 'Multi-Download-Tool v1.0 ' & Chr(169) & ' by Oscar (http://www.autoit.de)'
    Global $sInifile = @ScriptDir & '\MDT.ini'
    Global $aDownloads = IniReadSection($sInifile, 'Downloads')
    If @error Then Exit MsgBox(0, $sTitle, 'Inidatei nicht gefunden bzw. fehlerhaft!')
    Global $iStop = False
    $hGui = GUICreate($sTitle, 480, 420)
    GUISetIcon(@ScriptDir & '\prog.ico')
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    GUICtrlCreateGroup('Zielverzeichnis', 5, 5, 470, 60)
    GUICtrlCreateIcon(@SystemDir & '\shell32.dll', -5, 15, 25, 32, 32)
    $hTarget = GUICtrlCreateInput(@MyDocumentsDir & '\Downloads\', 50, 32, 380, 20, BitOR($ES_READONLY, $ES_AUTOHSCROLL))
    GUICtrlCreateButton('...', 430, 31, 32, 22)
    GUICtrlSetOnEvent(-1, '_SelectTarget')
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    $LVStyle = BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS)
    $ExStyle = BitOR($LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE, $LVS_EX_CHECKBOXES, $LVS_EX_DOUBLEBUFFER)
    $hListView = GUICtrlCreateListView('Programme auswählen...', 5, 75, 470, 175, $LVStyle, $ExStyle)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 440)
    $contextmenu = GUICtrlCreateContextMenu($hListView)
    GUICtrlCreateMenuItem('Alle markieren', $contextmenu)
    GUICtrlSetOnEvent(-1, '_CheckAll')
    GUICtrlCreateMenuItem('Keins markieren', $contextmenu)
    GUICtrlSetOnEvent(-1, '_UnCheckedAll')
    $hStart = GUICtrlCreateButton('Download starten', 5, 270, 100, 25)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetOnEvent(-1, '_StartDownload')
    $hAVICopy = GUICtrlCreateAvi(@SystemDir & '\shell32.dll', 170, 120, 250)
    GUICtrlSetState(-1, $GUI_HIDE)
    $hDispAct = GUICtrlCreateLabel('0%', 220, 315, 50, 20, $SS_CENTER)
    $hProgrAct = GUICtrlCreateProgress(5, 330, 470, 16)
    $hDispAll = GUICtrlCreateLabel('0%', 220, 355, 50, 20, $SS_CENTER)
    $hProgrAll = GUICtrlCreateProgress(5, 370, 470, 16)
    $hStatus = _GUICtrlStatusBar_Create($hGui)
    _GUICtrlStatusBar_SetText($hStatus, '0 Programme ausgewählt')
    GUISetState()
    HotKeySet('{ESC}', '_StopDownload')

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

    Dim $ListViewItem_IDs[$aDownloads[0][0]]
    For $i = 1 To $aDownloads[0][0]
    $ListViewItem_IDs[$i - 1] = GUICtrlCreateListViewItem($aDownloads[$i][0], $hListView)
    GUICtrlSetOnEvent(-1, '_RefreshCounter')
    Next
    While 1
    Sleep(1000)
    WEnd

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

    Func _End()
    Exit
    EndFunc ;==>_End

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

    Func _GetIDByName($iArray, $iName)
    For $Loop = 0 To UBound($iArray) - 1
    If StringTrimRight(GUICtrlRead($iArray[$Loop]), 1) = $iName Then Return $iArray[$Loop]
    Next
    EndFunc ;==>_GetIDByName

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

    Func _StartDownload()
    GUICtrlSetState($hStart, $GUI_DISABLE)
    ;~ GUICtrlSetState($hListView, $GUI_DISABLE)
    GUICtrlSetData($hDispAll, '0%')
    GUICtrlSetData($hProgrAll, 0)
    Local $aCheckedIndices, $iSize, $sTargetFile, $sPath, $iPercent, $iOld, $iPercentAll, $iBytesRead, $iBreak
    $sPath = GUICtrlRead($hTarget)
    If Not FileExists($sPath) Then DirCreate($sPath)
    $aCheckedIndices = _GUICtrlListView_GetCheckedIndices($hListView)
    GUICtrlSetState($hAVICopy, $GUI_SHOW)
    GUICtrlSetState($hAVICopy, 1)
    For $i = 0 To UBound($aCheckedIndices) - 1
    $sDownload = $aDownloads[$aCheckedIndices[$i] + 1][1]
    GUICtrlSetData($hDispAct, '0%')
    GUICtrlSetData($hProgrAct, 0)
    _GUICtrlStatusBar_SetText($hStatus, 'Download von "' & $aDownloads[$aCheckedIndices[$i] + 1][0] & '"')
    GUICtrlSetBkColor(_GetIDByName($ListViewItem_IDs, $aDownloads[$aCheckedIndices[$i] + 1][0]), 0xFF0000)
    $iSize = InetGetSize($sDownload)
    If Not @error Then
    $sTargetFile = $sPath & StringRegExpReplace($sDownload, '.+\/(.+\..{3}).*', '$1')
    $iStop = False
    InetGet($sDownload, $sTargetFile, 1, 1)
    While @InetGetActive
    $iBytesRead = @InetGetBytesRead
    $iPercent = Int(100 / $iSize * $iBytesRead)
    If $iBytesRead <> $iOld Then
    $iOld = $iBytesRead
    _GUICtrlStatusBar_SetText($hStatus, 'Download von "' & $aDownloads[$aCheckedIndices[$i] + 1][0] & '" (' & _ByteAutoSize($iOld) & ' / ' & _ByteAutoSize($iSize) & ')')
    GUICtrlSetData($hDispAct, $iPercent & '%')
    GUICtrlSetData($hProgrAct, $iPercent)
    EndIf
    If $iStop Then
    InetGet('abort')
    $iBreak += 1
    ExitLoop
    EndIf
    Sleep(50)
    WEnd
    Else
    $iBreak += 1
    EndIf
    GUICtrlSetData($hDispAct, '100%')
    GUICtrlSetData($hProgrAct, 100)
    $iPercentAll = Int(100 / UBound($aCheckedIndices) * ($i + 1 - $iBreak))
    GUICtrlSetData($hDispAll, $iPercentAll & '%')
    GUICtrlSetData($hProgrAll, $iPercentAll)
    Next
    GUICtrlSetState($hAVICopy, 0)
    GUICtrlSetState($hAVICopy, $GUI_HIDE)
    _GUICtrlStatusBar_SetText($hStatus, 'Downloads abgeschlossen!')
    GUICtrlSetState($hListView, $GUI_ENABLE)
    GUICtrlSetState($hStart, $GUI_ENABLE)
    EndFunc ;==>_StartDownload

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

    Func _StopDownload()
    $iStop = True
    EndFunc ;==>_StopDownload

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

    Func _SelectTarget()
    Local $sPath
    $sPath = FileSelectFolder('Bitte Zielverzeichnis auswählen', @DesktopDir, 3, '', $hGui)
    If @error Then Return
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    If FileExists($sPath) Then
    GUICtrlSetData($hTarget, $sPath)
    EndIf
    EndFunc ;==>_SelectTarget

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

    Func _RefreshCounter()
    Local $iCount = _GUICtrlListView_GetCheckedCount($hListView)
    If $iCount > 0 Then
    GUICtrlSetState($hStart, $GUI_ENABLE)
    Else
    GUICtrlSetState($hStart, $GUI_DISABLE)
    EndIf
    GUICtrlSetData($hDispAll, '0%')
    GUICtrlSetData($hProgrAll, 0)
    GUICtrlSetData($hDispAct, '0%')
    GUICtrlSetData($hProgrAct, 0)
    _GUICtrlStatusBar_SetText($hStatus, $iCount & ' Programm' & _Iif($iCount = 1, '', 'e') & ' ausgewählt')
    EndFunc ;==>_RefreshCounter

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

    Func _CheckAll()
    _GUICtrlListView_SetItemChecked($hListView, -1, True)
    _RefreshCounter()
    EndFunc ;==>_CheckAll

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

    Func _UnCheckedAll()
    _GUICtrlListView_SetItemChecked($hListView, -1, False)
    _RefreshCounter()
    EndFunc ;==>_UnCheckedAll

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

    Func _GUICtrlListView_GetCheckedCount($hListView)
    Local $iCount = _GUICtrlListView_GetItemCount($hListView), $iCheckedCount = 0
    If $iCount = 0 Then Return SetError(1, 0, 0)
    For $i = 0 To $iCount - 1
    $iCheckedCount += _GUICtrlListView_GetItemChecked($hListView, $i)
    Next
    Return $iCheckedCount
    EndFunc ;==>_GUICtrlListView_GetCheckedCount

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

    Func _GUICtrlListView_GetCheckedIndices($hListView)
    Local $iCount = _GUICtrlListView_GetItemCount($hListView)
    Local $iCheckedCount = _GUICtrlListView_GetCheckedCount($hListView)
    If $iCheckedCount = 0 Then Return SetError(1, 0, 0)
    Local $aCheckedItems[$iCheckedCount]
    $iCheckedCount = 0
    For $i = 0 To $iCount - 1
    If _GUICtrlListView_GetItemChecked($hListView, $i) Then
    $aCheckedItems[$iCheckedCount] = $i
    $iCheckedCount += 1
    EndIf
    Next
    Return $aCheckedItems
    EndFunc ;==>_GUICtrlListView_GetCheckedIndices

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

    ;===============================================================================
    ; Function Name: _ByteAutoSize($iSize, $iRound = 2, $iFormat = 0, $bThousands = True)
    ; Description:: Gibt einen Bytewert in einer bestimmten Einheit zurück
    ; Parameter(s): $iSize = Größe in Byte übergeben
    ; $iRound = Anzahl der Nachkommastellen (0...8)
    ; $iFormat = bestimmt den Rückgabewert
    ; 0 = Automatisch (je nach übergebenen Wert)
    ; 1 = in Byte
    ; 2 = in KByte
    ; 3 = in MByte
    ; 4 = in GByte
    ; $bThousands = Rückgabe mit Tausendertrennzeichen (True/False)
    ; Requirement(s): #include <String.au3>
    ; Author(s): Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _ByteAutoSize($iSize, $iRound = 2, $iFormat = 0, $bThousands = True)
    Local $aSize[4] = [' Byte', ' KByte', ' MByte', ' GByte'], $sReturn
    If $iFormat < 0 Or $iFormat > 4 Then $iFormat = 0
    If $iRound < 0 Or $iRound > 8 Then $iRound = 2
    If Not IsBool($bThousands) Then $bThousands = False
    $iSize = Abs($iSize)
    If $iFormat = 0 Then
    For $i = 30 To 0 Step -10
    If $iSize > (2 ^ $i) Then
    $iFormat = $i / 10 + 1
    ExitLoop
    EndIf
    Next
    EndIf
    If $iFormat = 0 Then $iFormat = 1
    $sReturn = Round($iSize / (2 ^ (($iFormat - 1) * 10)), $iRound)
    If $bThousands Then $sReturn = _StringAddThousandsSep($sReturn, '.', ',')
    Return $sReturn & $aSize[$iFormat - 1]
    EndFunc ;==>_ByteAutoSize

    [/autoit]
    • Offizieller Beitrag

    Oscar ,habe den Fehler glaube ich gefunden.

    Spoiler anzeigen
    [autoit]

    $hAVICopy = GUICtrlCreateAvi(@SystemDir & '\shell32.dll', 170, 120, 250)
    GUICtrlSetState(-1, $GUI_HIDE)

    [/autoit]

    Da es bei Vista Ultimate 64 die Avi scheinbar nicht gibt , wird das $GUI_HIDE auf den Button angewandt, da er das zuletzt erstellte Control ist

    Edit : Das Avi gibt es schon, aber @SystemDir liefert bei Vista Ultimate 64 : C:\Windows\SysWOW64.
    shell32.dll liegt aber in C:\System\System32

    • Offizieller Beitrag

    Das heißt, bei Dir wird die AVI dann auch nicht angezeigt, wenn Du die Zeile mit $GUI_HIDE entfernst?

    Oder reicht es, wenn ich stattdessen:

    [autoit]

    GUICtrlSetState($hAVICopy, $GUI_HIDE)

    [/autoit]


    schreibe?

    Edit:
    Sithlord95: Siehe Antwort von Raupi!

    Raupi : Verdammt! Warum muss Microsoft immer alle Pfade ändern? Gibt es ein AutoIt-Makro, dass (unter Vista Ultimate 64) auf den C:\System\System32-Ordner verweist?

    • Offizieller Beitrag

    Oscar

    [autoit]

    GUICtrlSetState($hAVICopy, $GUI_HIDE)

    [/autoit]

    reicht vollkommen aus. :thumbup:
    Dann wird die AVI nicht angezeigt, aber das restliche Script funzt.
    Ansonsten ist dein Script Super. :thumbup:

    Edit:

    Zitat

    Raupi : Verdammt! Warum muss Microsoft immer alle Pfade ändern? Gibt es ein AutoIt-Makro, dass (unter Vista Ultimate 64) auf den C:\System\System32-Ordner verweist?


    Sollte irgendwie in der Registry hinterlegt sein. Werde ich später mal suchen.

    • Offizieller Beitrag

    Hab das eben mal gestestet. Die Shell32.dll wird auch ohne Pfad gefunden. DIe Avi Datei ist aber leider in der Shell32.dll nicht enthalten.

    • Offizieller Beitrag

    Habe mal die shell32.dll durchsucht und tatasächlich eine Avi gefunden.

    [autoit]

    $hAVICopy = GUICtrlCreateAvi( 'shell32.dll', 165, 120, 250)

    [/autoit]

    PS: Oscar ich kann dir die Datei nicht schicken, ist zu Groß für den Anhang in der PN. Wenn du ICQ oder MSN hast, adde mich. Daten findet du im Profil.

  • Hallo Oscar,

    dein Multi-Downloader ist ein sehr brauchbares und nützliches Tool :thumbup: . Bei der Progressbar insgesamt hat sich anscheinend ein kleiner Bug eingeschlichen, der nur auftritt wenn nicht alle Downloads erfolgreich waren:
    autoit.de/wcf/attachment/6071/ autoit.de/wcf/attachment/6072/
    IrfanView habe ich selbst abgebrochen und die Downloads nicht weiter beobachtet (INet mit ca. 16 KB/sec Download) Avira war nicht erfolgreich, wurde bei 19 MB abgebrochen, TeamViewer wurde erst gar nicht angefangen downzuloaden. [OT]Bei meinem Zugang über Web-N-Walk kommen leider öfters Störungen im INet vor.[/OT]
    Das schöne ist aber ich sehe sofort anhand der Farbe, welche Downloads nicht geklappt haben und kann diese erneut starten.

    mfg (Auto)Bert

    • Offizieller Beitrag

    Eigentlich ist das kein Bug, sondern ein Feature. ;)
    Im Ernst, das wollte ich so, dass wenn die Downloads nicht alle erfolgreich waren, dass dann auch die Progressbar nicht 100% anzeigt, sondern je nachdem wie viele Programme gedownloadet wurden. Findest Du das verwirrend?
    Und das mit den Farben ist auch genau für solche Fälle, in denen der Download abgebrochen wurde.

  • Hallo Oscar,

    nein, ich wundere mich nur wie die 80% des gesamten zustande kommen:

    • 1. Ansatz für Gesamtprozent: 100 % / 5 (alle Downloads) * 2 (erfolgreiche Downloads) = 40 %
    • 2. Ansatz für Gesamtprozent 100 % / 5 (alle Downloads) * 3 (2 erfolgreiche Dowloads und einen selbst abgebrochen) = 60 %
    • 3. Ansatz für Gesamtprozent 100 % / 4 (alle Downloads - 1 selber abgebrochen) * 2 (2 erfolgreiche Dowloads) = 50 %


    Die Hauptinfo ist für mich die ListView, da seh ich welche Downloads schief gelaufen sind, von daher stört mich die Gesamtprozentzahl nicht,

    mfg (Auto)Bert

    • Offizieller Beitrag

    Ach, jetzt verstehe ich!
    Stimmt! Du hast recht, da war tatsächlich ein kleiner Fehler. Die Variable $iBreak wurde nicht erhöht, wenn der Download wegen schlechter Verbindung abgebrochen wurde, sondern nur, wenn man ihn selbst abgebrochen hat.
    Habe den Fehler behoben und so nebenbei noch ein kleines Feature eingeführt. Bei allen grünen Downloads werden die Haken entfernt, sodass am Ende nur die Haken bei den roten Downloads überbleiben. So braucht man einfach nur nochmal auf den "Download starten"-Button klicken, um die fehlgeschlagenen Downloads erneut zu versuchen.

    Neue Version in Post #1.