Inhalt von Ordner löschen

  • Hey Leute,
    hab mal wieder ne Frage.
    Und zwar möchte ich ein Script schreiben, was mir in einem festgelegten Ordner (z.B. N:\Datenaustausch) alles löscht bis auf sogenannte User Ordner (haben alle nur 3 Zeichen), aber der Inhalt der User Ordner soll ebenfalls gelöscht werden.
    Sprich im gesamten sollen dann in dem Ordner Datenaustausch nur noch User Ordner ohne Inhalt sein, alles andere soll gelöscht werden.
    Weis einer eine Möglichkeit wie ich das möglichst simpel bewerkstelligen kann? Vielleicht alle Ordnernamen in eine ini Datei schreiben und dann einfach alles löschen und dann jeden Ordner neu anlegen lassen.
    Hoff einer kann mir weiter helfen, ich proier derweil selber mal was ich da so zusammenbekomm.

    Mfg
    Apollo 13

  • soso...
    also ich habe jetzt noch mal etwas Zeit zum überdenken gehabt. Dabei hat sich bei einem Gespräch mit meinem Chef nun etwas anderes ergeben. Und zwar soll der Ordner jetzt einfach komplett auf ein anderes Laufwerk verschoben werden, und dann einfach nur wieder ein leer Ordner angelegt werden.
    Soweit ist ja auch alles für mich kein Problem.
    Nur möchte ich gerne einen Fortschrittsbalken einbauen, da der Ordner sehr groß ist, und man so nicht weiß ob er noch etwas kopiert, oder wie weit er gerade ist.

    Hier mal mein vorläufiger Code:

    Spoiler anzeigen
    [autoit]

    $Datenaustausch = "\\fs-piagms05\allgemein\Datenaustausch test"
    $Datenaustausch2 = "\\fs-piagms05\daten03\edv\Datenaustausch Backup"

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

    If FileExists($Datenaustausch) = 1 Then
    Call("_copy")
    Else
    MsgBox(16, "Error", "Datenaustausch Ordner existiert nicht!")
    ;Eventuell mit IniWrite Fehlerprotokoll erstellen? ->Ereignisanzeige?
    Exit
    EndIf

    Func _copy()
    MsgBox(0, "", "Ordner vorhanden!")

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

    If FileExists($Datenaustausch2) = 1 Then
    MsgBox(0, "", "Backup Ordner bereits vorhanden")
    Call("_del")
    Else
    DirMove($Datenaustausch, $Datenaustausch2, 1)
    Exit
    EndIf
    EndFunc

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

    Func _del()
    DirRemove("\\fs-piagms05\daten03\edv\Datenaustausch Backup", 1)

    If FileExists($Datenaustausch2) = 0 Then
    MsgBox(0, "", "Ordner Datenaustausch Backup erfolgreich gelöscht")
    Call("_copy")
    Else
    MsgBox(16, "", "Ordner wurde nicht gelöscht!")
    ;Eventuell mit IniWrite Fehlerprotokoll erstellen? ->Ereignisanzeige?
    Exit
    EndIf
    EndFunc

    [/autoit]

    Wie kann ich hier jetzt am einfachsten noch eine Progressbar einbauen, die mir dann angezeigt wird wenn der Ordner kopiert wird?

    Mfg
    Apollo 13

    P.S.: Ich habe bereits die Boardsuche benutzt, aber die Beispiele kann ich irgendwie nicht anwenden xD
    Wenn mir vlt einer zeigen könnte was ich noch einbinden muss, etc. das es so funktioniert wie gedacht.

    • Offizieller Beitrag

    Der einfachste Weg, um den Status zu zeigen, dürfte Tooltip sein:

    [autoit]

    ToolTip("Kopiervorgang << In Arbeit >>")
    DirMove($Datenaustausch, $Datenaustausch2, 1)
    ToolTip("Kopiervorgang << Beendet >>")
    Sleep(2000)
    ToolTip("")

    [/autoit]


    Denn eigentlich ist es doch nicht zwingend notwendig eine Progressanzeige zu haben. DirMove bietet dir auch keine Möglichkeit, den Fortschrittszustand abzufragen.

    Übrigens: "Call" ist ganz grausam :P Verwende doch statt Call("_copy") gleich den Aufruf _copy()

  • Hey...
    es hat sich doch noch etwas geändert...
    ist es auch möglich das ich nur Dateien/Ordner löschen/verschieben lasse die älter als 4 wochen sind, und alles andere erhalten bleibt??

    Mfg
    Apollo 13

    • Offizieller Beitrag
    [autoit]

    #include <file.au3>
    #include <date.au3>
    #include <array.au3>

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

    ;Root folder
    $sourceFolder = @ScriptDir & '\'

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

    ;Gather files into an array
    $fileList = _FileListToArray($sourceFolder, "*.txt", 1)
    Dim $found[1]

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

    ;Loop through array
    For $X = 1 To $fileList[0]
    ;Retrieve creation time of file
    $Date = FileGetTime($sourceFolder & "\" & $fileList[$X], 1, 0)
    ;Format date for use with Date UDF
    $fDate = StringFormat("%s/%s/%s %s:%s:%s", $Date[0], $Date[1], $Date[2], $Date[3], $Date[4], $Date[5])
    ;Calculate age, remove files older than one week
    If _DateDiff('d', $fDate, _NowCalc()) > 7 Then ;FileDelete($sourceFolder & "\" & $fileList[$X])
    _ArrayAdd($found, $sourceFolder & $fileList[$X])
    ;MsgBox(1, "Files deleted:", $fileList[$X], 1)
    EndIf
    Next
    _ArrayDisplay($found)

    [/autoit][autoit]

    Local $pattern = "*.*"
    Local $file
    Local $handle

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

    $handle = FileFindFirstFile("c:\Downloads\" & $pattern)
    If $handle = -1 Then
    MsgBox(4096, "Error", "No Files found!")
    Exit
    EndIf

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

    $list=""
    While 1
    $file = FileFindNextFile($handle)
    If @error Then ExitLoop
    If $file <> "." And $file <> ".." Then
    If Not StringInStr(FileGetAttrib($file), "D") Then; not a directory
    $time = FileGetTime($file,0,1)
    $now = @YEAR & @MON & (@MDAY-10) & @HOUR & @MIN & @SEC
    if $time < $now Then
    $list &= $file & @CRLF
    EndIf
    EndIf
    EndIf
    Wend
    FileClose($handle)
    MsgBox(0,"Files older 10 days",$list)

    [/autoit]

    Mega

    • Offizieller Beitrag

    Noch mehr

    Spoiler anzeigen
    [autoit]

    ; Define Source and Destination Directories

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

    $source = "c:\Downloads\Frisur"
    $dest = "c:\Downloads\Frisur\Müll"

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

    ; Obtain Source and Destination Directories' sizes

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

    $ssize = DirGetSize($source)
    $dsize = DirGetSize($dest)

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

    ; Removes "-1" return if the destination directory does not exist

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

    if $dsize < 0 then
    $dsize = 0
    Endif

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

    ; Begins the timer and XCOPY to copy files (will overwrite, remove /y switch to not overwirte)

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

    $tbegin = TimerInit()
    Run(@ComSpec & " /c xcopy /y /e " & $source & "*.* " & $dest, "", @SW_HIDE)

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

    ; Begins Progress Bar and sets it to 0

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

    ProgressOn("Copying Files ...", "", "0 %")
    ProgressSet(0, "Calculating transfer time...")
    sleep(2000); so that erroneous times are not calculated during xcopy startup

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

    For $percent = 0 to 100

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

    $copied = DirGetSize($dest) - $dsize ; calculates how much has been copied
    $percent = Round(($copied/$ssize),2) * 100; percentage copied
    $tdiff = TimerDiff($tbegin) ; time difference since copy began
    $tmin = Round(((100/$percent) -1) * ($tdiff/60000)) ; time (in minutes) to completion
    $tsec = Round(((100/$percent) -1)* ($tdiff/1000)) ; tims (in secs) to completion

    ; If the time remaining is less than 1 minute the progress bar will show time remaining in secs

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

    If $tsec < 60 then
    $tdisplay = "Approximately " & $tsec & " second(s) remaining"
    Else
    $tdisplay = "Approximately " & $tmin & " minute(s) remaining."
    Endif
    ProgressSet( $percent, "Percentage Copied: " & $percent & " %" & @LF _
    & $tdisplay)
    sleep(1000)
    Next
    ProgressSet(100 , "Complete", "")
    sleep(1500)
    ProgressOff()

    [/autoit]
    Spoiler anzeigen
    [autoit]

    ;-------------------------------------------------------------------------------------
    ; Kopiert die Datei c:\Postfach\Benutzer.pst nach \\ntsrv05\pst_archiv\A_Benutzer\
    ; wenn der Benutzer auf die Schaltfläche JA klickt

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

    #include <GUIConstants.au3>

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

    $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc") ; Install a custom error handler
    GUICreate("Radio Box Demo", 260, 140)
    GUICtrlCreateLabel("Soll die Datei kopiert werden ?", 20, 20, 250) ; first cell 50 width

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

    ; Create the controls
    $button_1 = GUICtrlCreateButton("Ja", 30, 50, 80, 40)
    $button_2 = GUICtrlCreateButton("Nein", 140, 50, 80, 40)

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

    ; Show the GUI
    GUISetState()

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

    ; Auswahl ausführen.........
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $msg = $button_1
    GUISetState(@SW_HIDE)
    ;MsgBox(0, "Default button clicked", "Ja" )
    ;$username = EnvGet("username")
    copy("c:\Downloads\Systemsoftware_INSTALL\Windows Updates\WindowsXP-KB835935-SP2-DEU.exe" , "c:\WindowsXP-KB835935-SP2-DEU.exe" )
    Case $msg = $button_2
    Exit;MsgBox(0, "Default button clicked", "Nein" )

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

    EndSelect
    WEnd

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

    Func copy($fromFile, $tofile)
    Local $FOF_RESPOND_YES = 16
    Local $FOF_SIMPLEPROGRESS = 256
    $winShell = ObjCreate("shell.application")
    $winShell.namespace ($tofile).CopyHere ($fromFile, $FOF_RESPOND_YES)
    If @error Then MsgBox(0, "", "the previous line got an error.")
    EndFunc ;==>copy

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

    ; This is my custom error handler
    Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    MsgBox(0, "", "We intercepted a COM Error !" & @CRLF & _
    "Number is: " & $HexNumber & @CRLF & _
    "Windescription is: " & $oMyError.windescription)
    SetError(1) ; something to check for when this function returns
    EndFunc ;==>MyErrFunc

    [/autoit]

    Mega

  • Hey Xenobiologist,
    erst mal big THX für die Scripte...bin grad dabei mich da einzulesen/einzulernen...
    aber wenn ich das erste Script ausführe sagt er mir
    ==> Subscript used with non-Array variable. (kommt bei For $X = 1 To $fileList[0]

    ich brauch ja die eckigen Klammern für das Array...warum macht es dann da einen Fehler? *Angst*

    Habs auch grad mit der neuesten Stable Version getestet...gleicher Fehler =(

    was mach ich nur jetzt schon falsch

    Mfg
    Apollo 13

    Edit:
    Ich habs jetzt schlussendlich doch anders gelöst...weil mir das mit AutoIT zu kompliziert dann war...und ich nich so viel lust und zeit hab das in der Arbeit rumzuprobieren bis es geht xD.
    Ich hab mit hilfe von robocopy und ner kleinen batchdatei das jetzt gemacht.
    macht auch das was ich will...gott sei dank =)
    und wenns unbedingt sein müsste und ich mal viel zeit hab^^ dann kann ich das ja noch mit autoit "verfeinern"

    Trotzdem nochmal danke an alle die geholfen haben =)

    2 Mal editiert, zuletzt von bugmenot1 (4. September 2008 um 15:24)