Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Probleme mit der Verzeichnisstruktur bei xcopy (Archivierung nach Erstellungsdatum)

Frage Entwicklung Batch & Shell

Mitglied: mike0208

mike0208 (Level 1) - Jetzt verbinden

15.01.2009, aktualisiert 17:47 Uhr, 4874 Aufrufe, 13 Kommentare

Hallo zusammen,

ich habe ein kleines Problem mit der Erhaltung der Verzeichnisstruktur bei Andwendung von xcopy. Mein folgendes Skript kopiert alle Dateien aus einem Ordner und sortiert sie in neue Ordner die nach dem Erstellungsjahr der Datei erzeugt werden.

@Echo off & Setlocal



Set "QuellDirFiles=M:\Dokumente und Einstellungen\Desktop\xcopy"
Set "ZielDirRoot=M:\Dokumente und Einstellungen\Desktop\xcopy2008"


for /R "%QuellDirFiles%" %%i in (*.*) do (for /f "tokens=3 delims=. " %%a in ("%%~ti") do @if not exist "%ZielDirRoot%\%%a" md "%ZielDirRoot%\%%a")

for /R "%QuellDirFiles%" %%i in (*) do @for /f "tokens=3 delims=. " %%a in ("%%~ti") do xcopy "%%~fi" "%ZielDirRoot%\%%a" /s /e


Nun zum Problem, wenn ich nur Dateien sortieren möchte klappt dies Wunderbar, aber sobald Ordner und Unterordner ins Spiel kommen, stimmt die Verzeichnisstruktur nicht mehr und Dateien liegen nur im ersten Verzeichnis, was auch logisch ist bei meiner momentanen Implementierung
Vielleicht kann mir jemand helfen wie ich mein xcopy oder oder die for Anweisung optimieren kann. Vielen Dank.

Viele Grüße
Mike
Mitglied: Biber
15.01.2009 um 18:53 Uhr
Moin Mike0208,

reicht es nicht, wenn Du statt des XCOPY-Befehls einfach "nur" den normalen COPY-Befehl verwendest?

Grüße
Biber
Bitte warten ..
Mitglied: mike0208
15.01.2009 um 20:49 Uhr
Hallo Biber,

danke für die schnelle Antwort. Mit dem normalen COPY Befehl hab ich leider nur die files in meinem Zielordner(alle auf der ersten Ebene und ohne Ordner), ich würde aber gerne die files in der Verzeichnisstruktur liegen haben wie im Quellverzeichnis.


Wenn ich nun den Befehl zum kopieren so umänder:

for %%i in ("%QuellDirFiles%") do @for /f "tokens=3 delims=. " %%a in ("%%~ti") do xcopy "%%~fi" "%ZielDirRoot%\%%a" /s /e

Hab ich zwar meine korrekte Verzeichnisstruktur, aber die files werden dann nicht nach ihrem erstellten Datum sortiert.
Bitte warten ..
Mitglied: Biber
15.01.2009 um 22:45 Uhr
Moin mike0208,

ah... jetzt glaube ich zu wissen, was Du meinst...

Dann so:
01.
@Echo off & Setlocal 
02.
 
03.
Set "QuellDirFiles=M:\Dokumente und Einstellungen\Desktop\xcopy" 
04.
Set "ZielDirRoot=M:\Dokumente und Einstellungen\Desktop\xcopy2008" 
05.
FOR /R "%QuellDirFiles%" %%i in (*) DO ( 
06.
    FOR /F "tokens=3 delims=. " %%a IN ("%%~ti") DO ( 
07.
     XCopy "%%~fi" "%ZielDirRoot%\%%a\" /s /e 
08.
 ))
Die erste FOR/R-Anweisung habe ich weggelassen, XCopy legt die Verzeichnisse ohnehin an.

Entscheidend ist nicht das optische Auseinanderziehen in mehrere Zeilen (ist nur zur Lesbarkeit),
wichtig ist der Backslash am Ende des Zielverzeichnisses.

Grüße
Biber
Bitte warten ..
Mitglied: mike0208
15.01.2009 um 22:56 Uhr
Hallo Biber,
ja das habe ich auch schon versucht, leider hab ich nun in meinem Zielverzeichnis die Dateien immer auf der ersten Ebene und nicht in den entsprechenden Verzeichnissen wo sie eigentlich hinsollten. Die Verzeichnisse sind da, nur eben leer. Und jedes Unterverzeichnis taucht auch nochmals in der ersten Ebene auf, die sind zuviel.
Denke der Fehler liegt in der rekursivität oder so... hmmm

Grüße Mike
Bitte warten ..
Mitglied: Biber
15.01.2009 um 23:14 Uhr
Moin mike0208,

Dann bitte ich um Erläuterung.
Ich erhalte folgendes Ergebnis
>dir "y:\Eigene Dateien\Eigene Musik" /b /s 
y:\Eigene Dateien\Eigene Musik\Beispielmusik.lnk 
y:\Eigene Dateien\Eigene Musik\DEFAULT.PLS 
y:\Eigene Dateien\Eigene Musik\Desktop.ini 
y:\Eigene Dateien\Eigene Musik\iTunes 
y:\Eigene Dateien\Eigene Musik\iTunes\iTunes Library.itl 
y:\Eigene Dateien\Eigene Musik\iTunes\iTunes Music 
y:\Eigene Dateien\Eigene Musik\iTunes\iTunes Music Library.xml 
 
(=23:09:42  D:\temp=) 
>dir "y:\Eigene Dateien\Eigene Kopie" /b /s 
y:\Eigene Dateien\Eigene Kopie\06 
y:\Eigene Dateien\Eigene Kopie\08 
y:\Eigene Dateien\Eigene Kopie\06\iTunes Library.itl 
y:\Eigene Dateien\Eigene Kopie\06\iTunes Music 
y:\Eigene Dateien\Eigene Kopie\06\iTunes Music Library.xml 
y:\Eigene Dateien\Eigene Kopie\08\Beispielmusik.lnk 
y:\Eigene Dateien\Eigene Kopie\08\DEFAULT.PLS 
y:\Eigene Dateien\Eigene Kopie\08\Desktop.ini 
y:\Eigene Dateien\Eigene Kopie\08\iTunes 
y:\Eigene Dateien\Eigene Kopie\08\iTunes\iTunes Music
... mit dem geposteten Batch und
  • dem Quellverzeichnis ""y:\Eigene Dateien\Eigene Musik"
  • dem zielverzeichnis ""y:\Eigene Dateien\Eigene Kopie"

in dem Quellverzeichnis sind Dateien aus 2006 und 2008... und die werden entmischt.
Wie sollte es richtiger aussehen im Ergebnis?

Grüße
Biber
Bitte warten ..
Mitglied: mike0208
15.01.2009 um 23:28 Uhr
Hallo Biber,

danke für deine Bemühungen, nehmen wir mal die Datei "iTunes Library.itl" die vor dem Kopieren in dem Ordner iTunes steckt. Aber nach dem Kopieren liegt sie nicht mehr in diesem Ordner. Sondern ich nenne es mal "ersten Ebene" des Zielordners. So geschieht es auch wenn man Unterordner von Unterordnern hat. Ich hoffe mein Problem ist nun etwas verständlicher, ansonsten versuche ich es gerne nochmals

Grüße
Mike
Bitte warten ..
Mitglied: Biber
15.01.2009 um 23:34 Uhr
Moin mike0208,

jetzt glaube ich NOCH mehr verstanden zu haben.

Folgendes Ergebnis im angepassten Batch:
>dir "y:\Eigene Dateien\Eigene Kopie2" /b /s 
y:\Eigene Dateien\Eigene Kopie2\06 
y:\Eigene Dateien\Eigene Kopie2\08 
y:\Eigene Dateien\Eigene Kopie2\06\iTunes 
y:\Eigene Dateien\Eigene Kopie2\06\iTunes\iTunes Library.itl 
y:\Eigene Dateien\Eigene Kopie2\06\iTunes\iTunes Music 
y:\Eigene Dateien\Eigene Kopie2\06\iTunes\iTunes Music Library.xml 
y:\Eigene Dateien\Eigene Kopie2\08\Beispielmusik.lnk 
y:\Eigene Dateien\Eigene Kopie2\08\DEFAULT.PLS 
y:\Eigene Dateien\Eigene Kopie2\08\Desktop.ini 
y:\Eigene Dateien\Eigene Kopie2\08\iTunes 
y:\Eigene Dateien\Eigene Kopie2\08\iTunes\iTunes Music
... mit folgender Variante.
01.
:: ----snipp JahrArchivXCopy.cmd --- 
02.
@Echo off & SetLocal EnableDelayedExpansion 
03.
 
04.
Set "QuellDirFiles=Y:\Eigene Dateien\Eigene Musik" 
05.
Set "ZielDirRoot=Y:\Eigene Dateien\Eigene Kopie2" 
06.
REM              0_________1_________2_________3_ [10er-Stellen] 
07.
REM              01234567890123456789012345678901 [ 1erStellen] 
08.
FOR /R "%QuellDirFiles%" %%i in (*) do @( 
09.
    for /f "tokens=3 delims=. " %%a in ("%%~ti") do ( 
10.
     call :setfipart "%%~fi"      
11.
     xcopy "%%~fi" "%ZielDirRoot%\%%a\!fipart!" /s /e 
12.
  ))    
13.
goto :eof 
14.
   
15.
:setfipart 
16.
Set "Fipart=%~dp1" 
17.
Set "FiPart=%fipart:~31%" 
18.
goto :eof 
19.
:: ----snapp JahrArchivXCopy.cmd ---
Änderungen:
  • Ergänzung von EnableDelayedExpansion in der 1. (Code-)Zeile
  • zwei REM-Zeilen zum Abzählen der Länge des QuellRoot-Pfades. 29 Zeichen lang +"\" = 30 Zeichen ist der Rootpfad lang
  • der Restpfad der Quelldatei begint also ab Zeichen 31 des Gesamt-Quell-Pfad+Dateinamens %%~fi
  • der Rest sollte dann nachvollziehbar sein.

Grüße
Biber
Bitte warten ..
Mitglied: mike0208
16.01.2009 um 00:10 Uhr
Hey Biber,

es geht, unglaublich. Vielen Vielen Dank für deine Hilfe und Bereitschaft echt genial.
Ich kenn mich leider nur in der Shell aus, darum hab ich keinen Plan was in der Batch so möglich ist.



Grüße Mike
Bitte warten ..
Mitglied: Biber
16.01.2009 um 12:27 Uhr
Moin mike0208,

auf Anfrage auch noch die etwas wartbarere Fassung mit der Länge/dem Offset in einer Variablen.
01.
:: ----snipp JahrArchivXCopy.cmd ---  
02.
@Echo off & Setlocal enableDelayedExpansion 
03.
 
04.
:: ## Die nächsten zwei Zeilen anpassen... 
05.
Set "QuellDirRoot=Y:\Eigene Dateien\Eigene Musik" 
06.
Set "ZielDirRoot=Y:\Eigene Dateien\Eigene Kopie2" 
07.
:: ## ab hier nichts mehr anzupassen... 
08.
 
09.
REM Länge von QuellDirRoot+2 ermitteln und merken 
10.
Echo %QuellDirRoot%>%temp%\fipartOffset 
11.
FOR %%i in (%temp%\fipartOffset) DO SET "fipartOffset=%%~zi" 
12.
 
13.
FOR /R "%QuellDirRoot%" %%i in (*) do @( 
14.
    for /f "tokens=3 delims=. " %%a in ("%%~ti") do ( 
15.
     call :setfipart "%%~fi"      
16.
     xcopy "%%~fi" "%ZielDirRoot%\%%a\!fipart!" /s /e 
17.
  ))    
18.
goto :eof 
19.
   
20.
:setfipart 
21.
Set "Fipart=%~dp1" 
22.
Set "FiPart=!fipart:~%fipartOffset%!" 
23.
goto :eof 
24.
:: ----snipp JahrArchivXCopy.cmd --- 
Grüße
Biber

[Edit 21.01.2008] Falschen Variablennamen %QuellDirFiles% in %QuellDirRoot% korrigiert. Siehe unten. [/Edit]
Bitte warten ..
Mitglied: mike0208
21.01.2009 um 19:42 Uhr
Hallo Biber,
als ich das Skript nun im Alltag einsetzen wollte, kam es leider zu Fehlern. Wenn ich nur wenige Dateien kopiere klappt es, sind es aber ca. 20.000 kommt es zu Fehlern.
Manchmal habe ich zuviele oder zu wenige Dateien oder Ordner und manche Dateien liegen in einem falschen Verzeichnis (aber nicht im falschen Jahresverzeichnis, Versteckte Verz. wurden auch berückssichtigt). Des öfteren kommt es beim ausführen vor, ob man die vorhandene Datei ersetzen möchte (Zielordner wurde vor neuen Versuchen natürlich gelöscht). Der Zielordner ist natürlich auch in einem Verzeichnis, wo nicht gesucht wird

Hast du noch eine Idee wo sich ein Fehler befinden könnte?
Und warum werden manchmal mehr als eine Datei aufeinmal kopiert, müsste nicht jede Datei nach diesen Skript einzeln kopiert werden?

Vielen Dank
Grüße Mike


Hier mein momentaner Stand:

Echo off & Setlocal enableDelayedExpansion

Set "ZielDirRoot=M:\Dokumente und Einstellungen\m\tmp_mike"
Set "QuellDirFiles=M:\Dokumente und Einstellungen\m\Desktop"

Echo %QuellDirRoot%>%temp%\fipartOffset
FOR %%i in (%temp%\fipartOffset) DO SET "fipartOffset=%%~zi"


FOR /R "%QuellDirFiles%" %%i in (*.*) do @(
REM Die DateiListe.txt enthält alle Dateien die gefunden werden
FOR /F "tokens=3 delims=. " %%a in ("%%~ti") do (
call :setfipart "%%~fi"
echo Datei: %%i >> "%ZielDirRoot%\DateiListe.txt"
echo "%%~fi"
IF %%a GEQ 2009 (
xcopy "%%~fi" "%ZielDirRoot%\2009\!fipart!" /s /e /y
) ELSE (
xcopy "%%~fi" "%ZielDirRoot%\2008\!fipart!" /s /e /y
)
))
goto :eof

:setfipart
Set "Fipart=%~dp1"
Set "FiPart=!fipart:~%fipartOffset%!"
goto :eof
Bitte warten ..
Mitglied: Biber
21.01.2009 um 20:06 Uhr
Moin mike0208,

jetzt, wo Du es sagst.....

ist mir ja oberpeinlich..... ein meiner Skizze ist ein zwar beliebter, aber dennoch saublöder Fehler drin.

Ich definiere irgendwo eine Variable %QuellDirFiles% und arbeite eine Zeile später mit dem Variablennamen, den ich mir 5 Sekunden lang merken konnte.
Und der heisst dann auch erkennbar ähnlich. Nämlich %QuellDirRoot%.

.... 
Set "QuellDirFiles=M:\Dokumente und Einstellungen\m\Desktop" 
 
Echo %QuellDirRoot%>%temp%\fipartOffset
Bitte ändere alle Vorkommnisse von "QuellDirFiles" in "QuellDirRoot".

Das sollte die Fehlerhäufigkeit spürbar senken.

Sorry nochmal
Biber
Bitte warten ..
Mitglied: mike0208
21.01.2009 um 20:09 Uhr
Hallo Biber,

sorry das war ein copy paste Fehler von mir

das ist nun mein akueller stand:

@Echo off & Setlocal enableDelayedExpansion

Set "ZielDirRoot=C:\Users\Mike\Desktop\b"
Set "QuellDirRoot=C:\Users\Mike\Desktop\a"

REM Länge von QuellDirRoot+2 ermitteln und merken
Echo %QuellDirRoot%>%temp%\fipartOffset
FOR %%i in (%temp%\fipartOffset) DO SET "fipartOffset=%%~zi"
echo %fipartOffset%

FOR /R "%QuellDirRoot%" %%i in (*.*) do @(
FOR /F "tokens=3 delims=. " %%a in ("%%~ti") do (
call :setfipart "%%~fi"
echo "%%~fi"
IF %%a GEQ 2009 (
xcopy "%%~fi" "%ZielDirRoot%\2009\!fipart!" /s /e
) ELSE (
xcopy "%%~fi" "%ZielDirRoot%\2008\!fipart!" /s /e
)
))

:setfipart
Set "Fipart=%~dp1"
Set "FiPart=!fipart:~%fipartOffset%!"
goto :eof



und warum kommt wenn man sehr viele Dateien kopiert, die Frage ob ich die Datei übschreiben möchte? Das heißt doch er wird hier einiges zuviel gemacht (Zielordner ist natürlich leer vor dem ausführen )
Bitte warten ..
Mitglied: Biber
21.01.2009 um 21:07 Uhr
Moin mike0208,

dafür können eigentlich nur die beiden XCopy-Parameter "/s /e" verantwortlich sein.
Die habe ich damals bei meinen ersten Herantast-Versuchen von Deinem Ausgangsschnipsel blind übernommen.
Und, wie Du ja weißt, Copy & Paste ist nach Schwarzarbeit und der F.D.P. das drittgrößte volkswirtschaftliche Risiko.

Lass die beiden Parameter weg [d.h. der Parameter /e ist ohnehin Dönekens, aber /s stört in Deinem Fall.].

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Xcopy Probleme (3)

Frage von GtaGamer zum Thema Batch & Shell ...

Windows 7
gelöst Sind euch verstärkte Probleme bei Windows 7 Updates aufgefallen? (4)

Frage von RadioHam zum Thema Windows 7 ...

Cloud-Dienste
gelöst OwnCloud 8 Probleme mit Vorschaubildern auf Mobilgeräten (1)

Frage von zeroblue2005 zum Thema Cloud-Dienste ...

Windows 10
gelöst VPN Verbindung Probleme (7)

Frage von Yeter2 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...