newbie AUTOIT: Bestimmte Dateitypen inkl. Unterverzeichnisse kopieren

  • hallo,

    ich bin neu hier und auch mit AUTOIT habe ich erst seit kurzem erste Erfahrungen gesammelt. Da ich aber ein alter Hase im IT-Geschäft bin, habe ich von früher noch bissl vb erfahrung.

    ich habe nur folgende aufgabenstellung, an der ich momentan noch bissl knobele:

    Ich muss Dateien von einem Verzeichnis in ein Backup Verzeichnis kopieren. Jedoch nur bestimmte Dateitypen, die in einer textdatei festgestelt sind. Außerdem müssen alle Unterverzeichnisse des Quelldirectories kopiert werden, sofern sich da eine Datei mit dem festgelegten typ befindet.

    Alles kein großes Thema. Hab das Skript soweit, aber ein großes Problem: es werden keine unterverzeichnisse mitkopiert. hier benötige ich Euren Rat. Hier ein Auszug des wichtigen Codes.

    [autoit]

    for $j = 1 to $fileincludedlines
    $aktuellezeile2 = filereadline($fileincluded, $j)
    $datenuebergabestatus = 0
    $datenuebergabestatus = dircreate ("s:\backup\" & $aktuellezeile & "\cad")
    if $datenuebergabestatus = 1 Then
    FileWriteLine($fileLog, "s:\backup\" & $aktuellezeile & "\cad erstellt = OK")
    Else
    FileWriteLine($fileLog, "s:\backup\" & $aktuellezeile & "\cad erstellen = Fehler")
    msgbox (0, "Fehler", "Das Verzeichnis " & "s:\test\" & $aktuellezeile & "\cad konnte nicht erstellt werden. Programmabbruch")
    Exit
    EndIf

    $datenuebergabestatus = 0
    $datenuebergabestatus = filecopy ("s:\test\" & $aktuellezeile & "\cad\" & $aktuellezeile2, "s:\backup\" & $aktuellezeile & "\cad")
    if $datenuebergabestatus = 1 Then
    FileWriteLine($fileLog, "s:\backup\" & $aktuellezeile & "\cad\" & $aktuellezeile2 & " kopieren in das Backup Verzeichnis = OK")
    Else
    FileWriteLine($fileLog, "s:\backup\" & $aktuellezeile & "\cad\" & $aktuellezeile2 & " kopieren in das Backup Verzeichnis = Keine Dateien dieses Typs vorhanden")
    EndIf
    Next

    [/autoit]


    ich denke, ich könnte es mit dem DOS Befehl xcopy /s realisieren, aber ich möchte nicht ubnedingt auf einen dos befehl zurückgreifen.

    danke für tipps. Vielen DANK! :) :rock:

  • Hallo oder eine Funktion von BugFix:

    Diese kann dir Dateien auch Rekursiv zurück geben.

    Spoiler anzeigen
    [autoit]

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]
  • danke


    ich habe jetzt einiges mit _filelistetoarray getestet. funktioniert soweit auch. jedoch werden mir nur die unterverzeichnisse auf erster ebene angezeigt.

    also z.b. wird das dir "c:\aufträge\1\cad" geprüft. darin befindet sich ein directory "test", darunter - also in "test" noch eines mit namen "test2". "test" wird angezeigt und kann ggf. kopiert werden. "test2" wird nicht angezeigt

    nochmals zur visualisierung "c:\aufträge\1\cad\test\test2

    hier noch der momentane code für den wichtigen teil. hilfe wäre sehr nett. vielen dank!!!

    Spoiler anzeigen
    [autoit]

    ;Beginn des Unterverzeichnischecks
    $unterverzeichnis = ""
    $unterverzeichnis = _FileListToArray("c:\aufträge\" & $aktuellezeile & "\cad\", "*", 2)
    If Not IsArray($unterverzeichnis) Then
    MsgBox(0, "", "kein unterverzeichnis gefunden")
    Else
    _ArrayDisplay($unterverzeichnis)

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

    $unterverzeichnislines = $unterverzeichnis[0]
    MsgBox(0, "", $unterverzeichnislines)
    For $u = 1 To $unterverzeichnislines
    MsgBox(0, "", $unterverzeichnis[$unterverzeichnislines])
    $datenuebergabestatus = 0
    $datenuebergabestatus = DirCreate("c:\aufträge\" & $aktuellezeile & "\cad\" & $unterverzeichnis[$unterverzeichnislines])
    If $datenuebergabestatus = 1 Then
    FileWriteLine($fileLog, "z:\archiv\" & $aktuellezeile & "\cad\" & $unterverzeichnis[$unterverzeichnislines] & " Verzeichnis erstellen = OK")
    Else
    FileWriteLine($fileLog, "z:\archiv\" & $aktuellezeile & "\cad\" & $unterverzeichnis[$unterverzeichnislines] & " Verzeichnis erstellen = Fehler")
    Exit
    EndIf

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

    Next
    ;For $u = 1 To $unterverzeichnislines
    EndIf

    [/autoit]

    bernd670 : Tags für Code und Spoiler eingefügt

    2 Mal editiert, zuletzt von bernd670 (29. Dezember 2010 um 14:45)