Automatisches Entpacken

  • Hallöchen,

    ich hab eine Frage ob das was ich vorhabe mit AutoIT realisierbar wäre..
    und zwar hab ich eine Ordner in dem sich wieder viele Ordner befinden, darin befinden sich viele .rars die Entpackt werden müssten.
    Nach dem Entpacken müssten die .rars Gelöscht werden und die nur die Entpackte Datei in dem Ordner behalten werden.

    Ist es möglich in AutoIT ein Programm zu schreiben, das wenn ich nur die Directory angebe und der in die Ordner reinschaut ob .rars drin sind, wenn ja entpackt und dann löscht??

    Ich hoffe das ist Verständlich so..

    Mit freundlichen Grüßen

    Einmal editiert, zuletzt von Madmaxx89 (28. November 2009 um 20:01)

  • Im Prinzip ja. Das Skript setzt sich dann aus zwei Schritten zusammen:
    1) Recursiv durch den Verzeichnisbaum nach RAR-Dateien suchen
    2) Die Tabelle der gefundenen Dateien abarbeiten sprich entpacken und dann RAR-Datei löschen
    Ich geh mal auf die Suche nach Punkt 1)

  • Schneller als der Schall :rolleyes:

  • Mir war irgendwie langweilig:

    Spoiler anzeigen
    [autoit]

    #include <_GetFilesFolder_Rekursiv.au3>
    #include <UnRAR.au3>

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

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

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

    $hUnRAR_CallBack = DllCallbackRegister("_UnRARProc", "int", "uint;int;int;int")
    Global $Cancel = False

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

    $sFolder = FileSelectFolder("Please select the Folder to search in", @DesktopDir, 7)
    If Not @error Then
    $aResult = _GetFilesFolder_Rekursiv($sFolder, "rar", 0)
    For $i = 1 To $aResult[0]
    _unpack($aResult[$i], 0, 1)
    Next
    EndIf

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

    DllCallbackFree($hUnRAR_CallBack)

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

    #Region UnpackFunction

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

    ;==================================================================================================
    ; Function Name: _unpack($sFile [,$iSubFolder=0 [,$iDelArch]])
    ; Description: Entpackt ein Archiv mithilfe der UnRAR.au3
    ; Parameter(s): $sFile der Dateipfad sowie Name des Archivs
    ; optional: $iSubFolder 0 (Standard) entpackt im jeweiligen Verz., 1 erstellt für
    ; jedes .Rar ein Sub-Directory
    ; optional: $iDelArch Gibt an, ob das Archiv nach erfolgreichem entpacken gelöscht werden
    ; soll. 0 (Standard) = Nein, 1 = Ja
    ; Return Value(s): 1 = Success , 0 = Failure
    ; Author(s): SEuBo (http://www.autoit.de)
    ;==================================================================================================
    Func _unpack($sFile, $iSubFolder = 0, $iDelArch = 0)
    Local $sFileFolder, $aSplit
    If ($iSubFolder > 1) Or ($iSubFolder < 0) Then $iSubFolder = 0
    If ($iDelArch > 1) Or ($iDelArch < 0) Then $iSubFolder = 0
    $hArchive = _RAR_OpenArchive($sFile)
    If @error Then
    MsgBox(16, "UnRAR", "Archive open error")
    Return 0
    Else
    _RAR_SetCallback($hArchive, $hUnRAR_CallBack)
    $aSplit = StringSplit($sFile, "\")
    For $i = 1 To $aSplit[0] - 1
    $sFileFolder &= $aSplit[$i] & "\"
    Next
    If $iSubFolder = 1 Then $sFileFolder &= StringReplace($aSplit[$aSplit[0]], ".rar", "") & "\"
    _Rar_UnpackArchive($hArchive, $sFileFolder)
    If @error Then
    MsgBox(16, "UnRAR", "Archive unpacking error")
    Return 0
    Else
    _RAR_CloseArchive($hArchive)
    If Not @error Then
    If $iDelArch = 1 Then
    If FileDelete($sFile) = 0 Then
    ConsoleWrite("Deleting " & $sFile & " failed." & @CRLF)
    Return 0
    Else
    Return 1
    EndIf
    EndIf
    Return 1
    Else
    Return 0
    EndIf
    EndIf
    Return 1
    EndIf
    EndFunc ;==>_unpack
    Func _CancelUnpack()
    $Cancel = True
    EndFunc ;==>_CancelUnpack
    Func _UnRARProc($Msg, $UserData, $P1, $P2)
    Switch $Msg
    Case $UCM_PROCESSDATA ;Return a positive value to continue process or -1 to cancel the archive operation
    If $Cancel = True Then Return -1
    Case $UCM_NEEDPASSWORD ;DLL needs a password to process archive
    Local $iPassGet = InputBox("Password required", "Please type a password", "", "*", 300, 120)
    If $iPassGet = "" Then Return -1 ;If user cancelled password entering
    Local $PassBuffer = DllStructCreate("char[256]", $P1)
    DllStructSetData($PassBuffer, 1, $iPassGet)
    Return 1
    Case $UCM_CHANGEVOLUME ;Process volume change
    If $P2 = $RAR_VOL_ASK Then ;Required volume is absent
    Local $iVolGet = InputBox("Next volume required", "Please type a path to the next volume", "", "", 300, 120)
    If $iVolGet = "" Then Return -1 ;If user cancelled path entering
    Local $VolBuffer = DllStructCreate("char[256]", $P1)
    DllStructSetData($VolBuffer, 1, $iVolGet)
    Return 1
    EndIf
    EndSwitch
    EndFunc ;==>_UnRARProc
    #EndRegion UnpackFunction

    [/autoit]

    EDIT: Funktionsbeschreibung enthielt einen Fehler.

  • Hey SEuBo,

    Vielen Dank.. =)
    Das ist ja grossartig..

    Hast du es bei die ausprobiert?
    Bei mir bringt es eine Fehlermeldung "Archive open Error"

    Aber vielen Dank schonmal für deine Mühe.. Und das hab ich alles deiner Langeweile zu verdanken.. :D

  • jap ich hab es ausprobiert. So ne Funktion zu schreiben ohne sie zu testen wär ja auch schön blöd hehe

    und bei mir ist kein Fehler aufgetreten. Wenn das Skript das archiv nicht öffnen kann ist es wohl beschädigt oder vllt passwordgeschützt(obwohl das Skript dann eigentlich automatisch nach nem passwort fragt)

    ändere ggf. mal

    [autoit]

    If @error Then
    MsgBox(16, "UnRAR", "Archive open error")
    Return 0
    Else

    [/autoit]


    zu

    [autoit]

    If @error Then
    MsgBox(16, "UnRAR", "Archive open error"&@CRLF&$sFile)
    Return 0
    Else

    [/autoit]


    Damit du wenigstens siehst, welche Datei probleme macht.

    Habe das grade mal reproduziert, wenn das Archiv beschädigt ist, kommt besagte Fehlermeldung. Alle anderen Archive werden aber trotzdem entpackt.

  • Hallo,

    Er kann mit keinem Archiv umgehen..
    Habe gedacht liegt eventuell daran das es viele Teilarchive sind,
    jedoch bringt er auch den Fehler wenn ich selbst eine .rar erstelle.

    Seltsam.. Ich hab keine Idee woran das liegt..

  • Hööö, ach wie blöd bin ich den.. :D
    habs ins scriptverzeichnis kopiert.. hab aber dann das script rauskopiert.. und vergessen die dll mitzunehmen.. :D

    Jetzt gehts.. =)

    Tut mir leid.. =)

    Ähm.. und in dem Ordner sind dann noch dir .rars, eine .sfv datei und und noch paar kleine details.. kann ich des so machen das er alle dateitypen löscht ausser mp3. und .avi oder so??

  • [autoit]

    If StringRight($aAfterUnRar[$i],3) <> "mp3" OR StringRight($aAfterUnRar[$i],3) <> "avi" Then

    [/autoit]

    Ist IMMER erfüllt !

    Wenn es 'mp3' ist, dann ist es nicht 'avi'.

    ==>

    [autoit]

    If StringRight($aAfterUnRar[$i],3) <> "mp3" AND StringRight($aAfterUnRar[$i],3) <> "avi" Then

    [/autoit]

    limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.