mike0208
Goto Top

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 face-smile
Vielleicht kann mir jemand helfen wie ich mein xcopy oder oder die for Anweisung optimieren kann. Vielen Dank.

Viele Grüße
Mike

Content-Key: 106183

Url: https://administrator.de/contentid/106183

Printed on: April 18, 2024 at 01:04 o'clock

Member: Biber
Biber Jan 15, 2009 at 17:53:44 (UTC)
Goto Top
Moin Mike0208,

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

Grüße
Biber
Member: mike0208
mike0208 Jan 15, 2009 at 19:49:16 (UTC)
Goto Top
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.
Member: Biber
Biber Jan 15, 2009 at 21:45:34 (UTC)
Goto Top
Moin mike0208,

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
Member: mike0208
mike0208 Jan 15, 2009 at 21:56:21 (UTC)
Goto Top
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
Member: Biber
Biber Jan 15, 2009 at 22:14:09 (UTC)
Goto Top
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
Member: mike0208
mike0208 Jan 15, 2009 at 22:28:55 (UTC)
Goto Top
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 face-smile

Grüße
Mike
Member: Biber
Biber Jan 15, 2009 at 22:34:49 (UTC)
Goto Top
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.
:: ----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
Member: mike0208
mike0208 Jan 15, 2009 at 23:10:30 (UTC)
Goto Top
Hey Biber,

es geht, unglaublich. Vielen Vielen Dank für deine Hilfe und Bereitschaft face-smile 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
Member: Biber
Biber Jan 16, 2009 at 11:27:15 (UTC)
Goto Top
Moin mike0208,

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]
Member: mike0208
mike0208 Jan 21, 2009 at 18:42:10 (UTC)
Goto Top
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 face-wink

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
Member: Biber
Biber Jan 21, 2009 at 19:06:17 (UTC)
Goto Top
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
Member: mike0208
mike0208 Jan 21, 2009 at 19:09:45 (UTC)
Goto Top
Hallo Biber,

sorry das war ein copy paste Fehler von mir face-smile

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 face-wink )
Member: Biber
Biber Jan 21, 2009 at 20:07:56 (UTC)
Goto Top
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