Probleme mit der Verzeichnisstruktur bei xcopy (Archivierung nach Erstellungsdatum)
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 106183
Url: https://administrator.de/forum/probleme-mit-der-verzeichnisstruktur-bei-xcopy-archivierung-nach-erstellungsdatum-106183.html
Ausgedruckt am: 12.05.2025 um 13:05 Uhr
13 Kommentare
Neuester Kommentar
Moin mike0208,
ah... jetzt glaube ich zu wissen, was Du meinst...
Dann so:
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
ah... jetzt glaube ich zu wissen, was Du meinst...
Dann so:
@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 (
XCopy "%%~fi" "%ZielDirRoot%\%%a\" /s /e
))
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
Moin mike0208,
Dann bitte ich um Erläuterung.
Ich erhalte folgendes Ergebnis
... mit dem geposteten Batch und
in dem Quellverzeichnis sind Dateien aus 2006 und 2008... und die werden entmischt.
Wie sollte es richtiger aussehen im Ergebnis?
Grüße
Biber
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
- 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
Moin mike0208,
jetzt glaube ich NOCH mehr verstanden zu haben.
Folgendes Ergebnis im angepassten Batch:
... mit folgender Variante.
Änderungen:
Grüße
Biber
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
:: ----snipp JahrArchivXCopy.cmd ---
@Echo off & SetLocal EnableDelayedExpansion
Set "QuellDirFiles=Y:\Eigene Dateien\Eigene Musik"
Set "ZielDirRoot=Y:\Eigene Dateien\Eigene Kopie2"
REM 0_________1_________2_________3_ [10er-Stellen]
REM 01234567890123456789012345678901 [ 1erStellen]
FOR /R "%QuellDirFiles%" %%i in (*) do @(
for /f "tokens=3 delims=. " %%a in ("%%~ti") do (
call :setfipart "%%~fi"
xcopy "%%~fi" "%ZielDirRoot%\%%a\!fipart!" /s /e
))
goto :eof
:setfipart
Set "Fipart=%~dp1"
Set "FiPart=%fipart:~31%"
goto :eof
:: ----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
Moin mike0208,
auf Anfrage auch noch die etwas wartbarere Fassung mit der Länge/dem Offset in einer Variablen.
Grüße
Biber
[Edit 21.01.2008] Falschen Variablennamen %QuellDirFiles% in %QuellDirRoot% korrigiert. Siehe unten. [/Edit]
auf Anfrage auch noch die etwas wartbarere Fassung mit der Länge/dem Offset in einer Variablen.
:: ----snipp JahrArchivXCopy.cmd ---
@Echo off & Setlocal enableDelayedExpansion
:: ## Die nächsten zwei Zeilen anpassen...
Set "QuellDirRoot=Y:\Eigene Dateien\Eigene Musik"
Set "ZielDirRoot=Y:\Eigene Dateien\Eigene Kopie2"
:: ## ab hier nichts mehr anzupassen...
REM Länge von QuellDirRoot+2 ermitteln und merken
Echo %QuellDirRoot%>%temp%\fipartOffset
FOR %%i in (%temp%\fipartOffset) DO SET "fipartOffset=%%~zi"
FOR /R "%QuellDirRoot%" %%i in (*) do @(
for /f "tokens=3 delims=. " %%a in ("%%~ti") do (
call :setfipart "%%~fi"
xcopy "%%~fi" "%ZielDirRoot%\%%a\!fipart!" /s /e
))
goto :eof
:setfipart
Set "Fipart=%~dp1"
Set "FiPart=!fipart:~%fipartOffset%!"
goto :eof
:: ----snipp JahrArchivXCopy.cmd ---
Grüße
Biber
[Edit 21.01.2008] Falschen Variablennamen %QuellDirFiles% in %QuellDirRoot% korrigiert. Siehe unten. [/Edit]
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%.
Bitte ändere alle Vorkommnisse von "QuellDirFiles" in "QuellDirRoot".
Das sollte die Fehlerhäufigkeit spürbar senken.
Sorry nochmal
Biber
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
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
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