Dateien aus einem Quellverzeichnis in Backupverzeichnis kopieren und in zehn Zielverzeichnisse verschieben
Hallo zusammen und nachträglich frohe Weihnachten 
ich habe lange gesucht und leider nichts finden können, was meinem Vorhaben entspricht:
Ich möchte jeweils eine Datei aus einem Quellverzeichnis (mit unterschiedlicher, möglicher Anzahl) zuerst in ein Backupverzeichnis kopieren und dann in eines von zehn Zielverzeichnisse verschieben.
So soll es aussehen:
Quelldatei 1 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 1
Quelldatei 2 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 2
Quelldatei 3 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 3
Quelldatei 4 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 4
Quelldatei 10 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 10
Quelldatei 11 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 1
Quelldatei 12 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 2
Wichtig ist das 1. das ganze nicht abbricht wenn im Quellverzeichnis KEINE Datei vorhanden ist und das die Zielverzeichnisse jeweils nur mit einer Datei "gefüttert" werden in fortlaufender, sich wiederholender Reihenfolge (Zielverzeichnis 1 - 10).
Gruß, Fritzel
ich habe lange gesucht und leider nichts finden können, was meinem Vorhaben entspricht:
Ich möchte jeweils eine Datei aus einem Quellverzeichnis (mit unterschiedlicher, möglicher Anzahl) zuerst in ein Backupverzeichnis kopieren und dann in eines von zehn Zielverzeichnisse verschieben.
So soll es aussehen:
Quelldatei 1 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 1
Quelldatei 2 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 2
Quelldatei 3 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 3
Quelldatei 4 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 4
Quelldatei 10 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 10
Quelldatei 11 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 1
Quelldatei 12 kopieren nach Backupverzeichnis, dann verschieben nach Zielverzeichnis 2
Wichtig ist das 1. das ganze nicht abbricht wenn im Quellverzeichnis KEINE Datei vorhanden ist und das die Zielverzeichnisse jeweils nur mit einer Datei "gefüttert" werden in fortlaufender, sich wiederholender Reihenfolge (Zielverzeichnis 1 - 10).
Gruß, Fritzel
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 178105
Url: https://administrator.de/forum/dateien-aus-einem-quellverzeichnis-in-backupverzeichnis-kopieren-und-in-zehn-zielverzeichnisse-verschieben-178105.html
Ausgedruckt am: 20.04.2025 um 18:04 Uhr
16 Kommentare
Neuester Kommentar
Hallo Fritzel,
Deine Anforderungen sind etwas mager beschrieben. Ich habe bei meinem Lösungsvorschlag mal vermutet, dass sich die Nummerierung der Quelldateien aus ihrer Sortierreihenfolge ergibt (alphabetisch, aufsteigend, nach Dateiname und -erweiterung).
Der Code ist noch nicht "scharf" geschaltet, dazu müssen erst noch die
Gruß
Friemler
Deine Anforderungen sind etwas mager beschrieben. Ich habe bei meinem Lösungsvorschlag mal vermutet, dass sich die Nummerierung der Quelldateien aus ihrer Sortierreihenfolge ergibt (alphabetisch, aufsteigend, nach Dateiname und -erweiterung).
@echo off & setlocal
set "SrcDir=."
set "BackupDir=E:\Backup"
set "NDestDirs=10"
set "DestDir1=E:\Verzeichnis 1"
set "DestDir2=E:\Verzeichnis 2"
set "DestDir3=E:\Verzeichnis 3"
set "DestDir4=E:\Verzeichnis 4"
set "DestDir5=E:\Verzeichnis 5"
set "DestDir6=E:\Verzeichnis 6"
set "DestDir7=E:\Verzeichnis 7"
set "DestDir8=E:\Verzeichnis 8"
set "DestDir9=E:\Verzeichnis 9"
set "DestDir10=E:\Verzeichnis 10"
for /f "tokens=1* delims=:" %%a in ('dir /b /a:-d-h-s /o:ne "%SrcDir%" 2^>NUL ^| findstr /n "^"') do (
call :ProcessFile %%a "%%b"
)
exit /b
:ProcessFile
set /a i=(%1-1)%%%NDestDirs%+1
echo copy "%SrcDir%\%~2" "%BackupDir%"
call echo move "%SrcDir%\%~2" "%%DestDir%i%%%"
exit /b
Der Code ist noch nicht "scharf" geschaltet, dazu müssen erst noch die
ECHO
-Befehle aus den Zeilen 27 und 28 entfernt werden.Gruß
Friemler
Hallo Fritzel,
tja, und woraus ergibt sich bei Dir die Nummer einer x-beliebigen Datei?...
Wie gesagt, ich habe mal auf die alphabetische Sortierreihenfolge getippt. Weitere Möglichkeiten wären z.B. das Erstellungsdatum, die Größe oder die physikalische Reihenfolge der Dateinamenseinträge im Verzeichnis. Aufsteigende und absteigende Sortierung bringt weitere Variationen.
Teste den obigen Code einfach mal. Er verändert nichts an Deinem System sondern gibt nur aus, was er tun würde. Dann siehst Du ja, ob das Deinen Anforderungen entspricht.
Gruß
Friemler
tja, und woraus ergibt sich bei Dir die Nummer einer x-beliebigen Datei?...
Wie gesagt, ich habe mal auf die alphabetische Sortierreihenfolge getippt. Weitere Möglichkeiten wären z.B. das Erstellungsdatum, die Größe oder die physikalische Reihenfolge der Dateinamenseinträge im Verzeichnis. Aufsteigende und absteigende Sortierung bringt weitere Variationen.
Teste den obigen Code einfach mal. Er verändert nichts an Deinem System sondern gibt nur aus, was er tun würde. Dann siehst Du ja, ob das Deinen Anforderungen entspricht.
Gruß
Friemler
Moin André,
ja, habe in letzter Zeit viel zu tun und mache mich deshalb etwas rar. Aber z.Z. ist ein kurzer Urlaub angesagt.
Btr. Manuelle
Es sind ja nur 10 Verzeichnisse. Zuerst hatte ich auch an ein Batch-Pseudo-Array gedacht mit Indizierung über eine berechnete Tokennummer einer
Gruß
Friemler
ja, habe in letzter Zeit viel zu tun und mache mich deshalb etwas rar. Aber z.Z. ist ein kurzer Urlaub angesagt.
Btr. Manuelle
DestDirs
:Es sind ja nur 10 Verzeichnisse. Zuerst hatte ich auch an ein Batch-Pseudo-Array gedacht mit Indizierung über eine berechnete Tokennummer einer
FOR /F
-Schleife, aber die Verzeichnisnamen könnten ja Leerzeichen enthalten und die Verarbeitung mehrerer in Anführungszeichen eingeschlossener Zeichenketten haben die Redmonder Praktikanten durch einen Programmierfehler bei FOR /F
unmöglich gemacht. Bei einer normalen FOR
-Schleife mit manuellem inkrementieren eines Hilfszählers und Vergleich mit dem berechneten Wert laut Formel aus Zeile 26 wird verzögerte Variablenerweiterung benötigt - das gefiel mir auch nicht. Deshalb etwas umständlich und Anfängertauglich.Gruß
Friemler
Hallo fritzel,
so, heute hatte ich mal Zeit mich mit Deiner Sache zu beschäftigen.
Das neue Script merkt sich die Nummer des Verzeichnisses, in das zuletzt eine Datei kopiert wurde, in einem INI-File. Dieses INI-File kann Einträge für mehrere Quellverzeichnisse enthalten.
Wie beim letzten Mal ist der Code nicht scharf geschaltet sondern zeigt nur an, was er tun würde. Das INI-File wird trotzdem erstellt. Nachdem Du getestet hast, kannst Du in den Zeilen 77 und 78 den
Gruß
Friemler
so, heute hatte ich mal Zeit mich mit Deiner Sache zu beschäftigen.
Das neue Script merkt sich die Nummer des Verzeichnisses, in das zuletzt eine Datei kopiert wurde, in einem INI-File. Dieses INI-File kann Einträge für mehrere Quellverzeichnisse enthalten.
Wie beim letzten Mal ist der Code nicht scharf geschaltet sondern zeigt nur an, was er tun würde. Das INI-File wird trotzdem erstellt. Nachdem Du getestet hast, kannst Du in den Zeilen 77 und 78 den
echo
-Befehl entfernen.@echo off & setlocal
::********** Config-Variablen **********
set "SrcDir=E:\Test\Quelle"
set "BackupDir=E:\Test\Backup"
set "NDestDirs=10"
set "DestDir1=E:\Test\Verz1"
set "DestDir2=E:\Test\Verz2"
set "DestDir3=E:\Test\Verz3"
set "DestDir4=E:\Test\Verz4"
set "DestDir5=E:\Test\Verz5"
set "DestDir6=E:\Test\Verz6"
set "DestDir7=E:\Test\Verz7"
set "DestDir8=E:\Test\Verz8"
set "DestDir9=E:\Test\Verz9"
set "DestDir10=E:\Test\Verz10"
::**************************************
::Aus einer INI-Datei, die den gleichen Namen wie das Script hat,
::wird die Nummer des letzten Verzeichnisses ausgelesen, in das
::beim letzten Scriptlauf eine Datei kopiert wurde.
::In der INI-Datei können Einträge für verschiedene Quellverzeichnisse
::stehen. Ein Eintrag ist nach dem Muster
:: PfadZumQuellverzeichnis=Nummer
::aufgebaut.
set /a Offset=0
if exist "%~dpn0.ini" (
for /f "usebackq tokens=1* delims==" %%a in ("%~dpn0.ini") do (
if "%%a" equ "%SrcDir%" (
set /a Offset=%%b
)
)
)
::Aus der eingelesenen Nummer mit der Modulo-Funktion den Offset für
::den aktuellen Scriptlauf berechnen.
set /a Offset=Offset%%NDestDirs
::Dateien im Quellverzeichnis verarbeiten
for /f "tokens=1* delims=:" %%a in ('dir /b /a:-d-h-s /o:ne "%SrcDir%" 2^>NUL ^| findstr /n "^"') do (
call :ProcessFile %%a "%%b"
)
::Die alte INI-Datei zeilenweise auslesen und dabei nach der Zeile
::suchen, die zum aktuellen Quellverzeichnis gehört. Diese Zeile
::wird mit aktualisiertem Wert in eine temporäre INI-Datei geschrieben.
::Alle anderen Zeilen werden unverändert in diese Datei geschrieben.
::Falls die INI-Datei noch nicht existiert, wird eine temporäre
::INI-Datei angelegt, die nur den Eintrag für das aktuelle Quell-
::verzeichnis enthält.
if exist "%~dpn0.ini" (
for /f "usebackq tokens=1* delims==" %%a in ("%~dpn0.ini") do (
if "%%a" neq "%SrcDir%" (
>>"%~dpn0_new.ini" echo %%a=%%b
) else (
>>"%~dpn0_new.ini" echo %%a=%i%
)
)
) else (
> "%~dpn0_new.ini" <NUL set /p "=%SrcDir%=%i%"
>>"%~dpn0_new.ini" echo.
)
::Die temporäre INI-Datei umbenennen und dabei die ggf. schon existierende
::alte INI-Datei ohne Nachfrage überschreiben.
move /y "%~dpn0_new.ini" "%~dpn0.ini" > NUL
::Script Ende
exit /b
::Unterprogramm
:ProcessFile
set /a i=(%1-1+Offset)%%NDestDirs+1
echo copy "%SrcDir%\%~2" "%BackupDir%"
call echo move "%SrcDir%\%~2" "%%DestDir%i%%%"
exit /b
Gruß
Friemler