Hallo! Ich würde gerne mit Autoit ein Script schreiben, dass Bilder von der Speicherkarte meiner Digicam auf meine Festplatte kopiert. Die Digicam legt die Bilder in verschiedene Unterordner für die verschiedenen Tage ab aber auf dem PC sollen die Bilder dann alle in einem Ordner sein, d.h. die Ordnerstruktur soll nicht mitkopiert werden sondern eben nur die Dateien. Komme nur noch irgendwie noch nicht so richtig mit Autoit zurecht Kann mir da jemand helfen? Grüße
Dateien ohne Ordnerstruktur kopieren
-
- [ gelöst ]
-
Quable -
2. April 2010 um 18:42 -
Geschlossen -
Erledigt
-
-
Im Prinzip brauchst du nur das hier (von BugFix):
Spoiler anzeigen
[autoit];==================================================================================================
[/autoit] [autoit][/autoit] [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
EndFuncFunc _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
[/autoit]
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
Um die Dateien auch aus den Unterverzeichnissen auszulesen.
Danach musst du nur noch alle Dateien mit FileCopy in ein beliebiges Verzeichnis kopieren. -
Schau dir mal FileCopy in der Hilfe an.
-
ich habs dir mal gebastelt:
Spoiler anzeigen
[autoit]#include <File.au3>
[/autoit] [autoit][/autoit] [autoit]
$quellpfad = FileSelectFolder("Quellpfad Wählen", "")
$zielpfad = FileSelectFolder("Zielpfad Wählen", "") & "\"
$arr = _FL2Arr($quellpfad, "*.jpg")
For $i = 0 To UBound($arr) - 1
FileCopy($arr[$i], $zielpfad)
Next
Msgbox(0,"","Fertig")Func _FL2Arr($sStDir, $sPat = '*', $iFlag = 0)
[/autoit] [autoit][/autoit] [autoit]
Local $cSQueue = ObjCreate("System.Collections.Queue")
If @error Then Return SetError(1, 1, -1)
Local $cRetQu = ObjCreate("System.Collections.Queue")
If @error Then Return SetError(1, 2, -1)
Local $FFFF, $FFNF, $sDir$sPat = StringReplace($sPat, "\", "\\")
[/autoit] [autoit][/autoit] [autoit]
$sPat = StringReplace($sPat, ".", "\.")
$sPat = StringReplace($sPat, "*", ".*")
$sPat = '^' & $sPat & '$'If StringRight($sStDir, 1) = '\' Then $sStDir = StringTrimRight($sStDir, 1)
[/autoit] [autoit][/autoit] [autoit]
If Not FileExists($sStDir) Then Return SetError(2, 0, "")
If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 0, "")$cSQueue.Enqueue($sStDir)
[/autoit] [autoit][/autoit] [autoit]While $cSQueue.Count > 0
[/autoit] [autoit][/autoit] [autoit]
$sDir = $cSQueue.Dequeue
$FFFF = FileFindFirstFile($sDir & '\*')
If $FFFF <> -1 Then
Do
$FFNF = FileFindNextFile($FFFF)
If @error Then ExitLoop
If @extended Then
$cSQueue.Enqueue($sDir & '\' & $FFNF)
If $iFlag <> 1 And StringRegExp($FFNF, $sPat) Then $cRetQu.Enqueue($sDir & '\' & $FFNF)
Else
If $iFlag < 2 And StringRegExp($FFNF, $sPat) Then $cRetQu.Enqueue($sDir & '\' & $FFNF)
EndIf
Until 0
EndIf
WEndIf $cRetQu.Count > 0 Then
[/autoit]
Return $cRetQu.ToArray
Else
Local $Ret[1] = [0]
Return $Ret
EndIf
EndFunc ;==>_FL2Arr -
Schnitzel big thx genau so hab ich mir des vorgestellt Noch eine Frage: Wenn im Zielordner schon ein paar von den zu Kopierenden Dateien da sind überschreibt das Script dann jedes Mal die Dateien nochmal oder fügt des dann nur noch die neuen Bilder dazu?
-
er überschreibt sie nicht und fügt einfach die neuen hinzu
(dachte mir das is das sinnvollste )wenn er sie überschreiben soll dann änder einfach das hier :
[autoit]FileCopy($arr[$i], $zielpfad)
[/autoit]in das um:
[autoit]FileCopy($arr[$i], $zielpfad, 1)
[/autoit] -
Jo stimmt schon so dasses nicht nochmal alles überschreibt Wollte nur nochmal sicher gehen
-
Das selbe Problem wurde >>hier<< schonmal besprochen.
Folgendes sollte effektiver sein als erst die ganze Ordnerstruktur in ein Array einzulesen:Spoiler anzeigen
[autoit]CopyPics("D:\Bilder", "C:\Bilder", "*.jpg")
[/autoit] [autoit][/autoit] [autoit];by AspirinJunkie
[/autoit] [autoit][/autoit] [autoit]
Func CopyPics($sStDir, $sTargDir, $sPat)
Local $cSQueue = ObjCreate("System.Collections.Queue")
If @error Then Return SetError(1, 1, -1)
Local $FFFF, $FFNF, $sDirIf StringRight($sStDir, 1) = '\' Then $sStDir = StringTrimRight($sStDir, 1)
[/autoit] [autoit][/autoit] [autoit]
If Not FileExists($sStDir) Then Return SetError(2, 0, "")$sPat = StringReplace($sPat, "\", "\\")
[/autoit] [autoit][/autoit] [autoit]
$sPat = StringReplace($sPat, ".", "\.")
$sPat = StringReplace($sPat, "*", ".*")
$sPat = '^' & $sPat & '$'$cSQueue.Enqueue($sStDir)
[/autoit] [autoit][/autoit] [autoit]While $cSQueue.Count > 0
[/autoit]
$sDir = $cSQueue.Dequeue
$FFFF = FileFindFirstFile($sDir & '\*')
If $FFFF <> -1 Then
Do
$FFNF = FileFindNextFile($FFFF)
If @error Then ExitLoop
If @extended Then
$cSQueue.Enqueue($sDir & '\' & $FFNF)
Else
If StringRegExp($FFNF, $sPat) Then FileCopy($sDir & '\' & $FFNF, $sTargDir & '\' & $FFNF, 9)
EndIf
Until 0
EndIf
WEnd
EndFuncSchnitzel
[autoit]
Ich habe das RückgabeArray der FL2Arr() bewusst 0-basiert gehalten damit For-In ermöglicht wird.
Ich persönlich finde es daher so etwas übersichtlicher:$arr = _FL2Arr($quellpfad, "*.jpg")
[/autoit][autoit][/autoit][autoit]For $i In $arr
[/autoit]
FileCopy($i, $zielpfad)
Next