fritzel
Goto Top

Dateien aus einem Quellverzeichnis in Backupverzeichnis kopieren und in zehn Zielverzeichnisse verschieben

Hallo zusammen und nachträglich frohe Weihnachten face-smile

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

Content-Key: 178105

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

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

Member: PhilippBeitz
PhilippBeitz Dec 27, 2011 at 11:57:45 (UTC)
Goto Top
Suchst du dafür ein Tool ? Oder brauchst du ein Script ?
Member: fritzel
fritzel Dec 27, 2011 at 12:02:52 (UTC)
Goto Top
Hallo Philipp,

suche hierfür ein Script.
Member: Friemler
Friemler Dec 27, 2011 at 12:08:48 (UTC)
Goto Top
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).

@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
Member: fritzel
fritzel Dec 27, 2011 at 12:22:50 (UTC)
Goto Top
Hallo Friemler,

ok, dachte ich hätte es auführlich genug ausgedrückt...

Also: die Quelldateien haben immer die Dateiendung .DAT; sie sollen nicht umbenannt werden. Einfach nur in die Ordner 1 - 10 kopiert werden; die 11. Datei dann wieder in Ordner 1, die 12. Datei in Ordner 2 etc.


Gruß, Fritzel
Member: Skyemugen
Skyemugen Dec 27, 2011 at 12:27:25 (UTC)
Goto Top
Aloha Friemler liest man auch mal etwas von dir,

[OT]
das hätte ich von dir aber nicht erwartet, dass du die DesrDirs alle manuell anlegen lässt *gg*
[/OT]

greetz André

P.S.: set /a i=(%1-1) warum muss ich bei derartigen is immer ans Visual Basic denken *grübel* face-smile
Member: Friemler
Friemler Dec 27, 2011 at 12:34:42 (UTC)
Goto Top
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
Member: Friemler
Friemler Dec 27, 2011 at 12:43:15 (UTC)
Goto Top
Moin André,

ja, habe in letzter Zeit viel zu tun und mache mich deshalb etwas rar. Aber z.Z. ist ein kurzer Urlaub angesagt. face-smile

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
Member: Skyemugen
Skyemugen Dec 27, 2011 at 13:41:45 (UTC)
Goto Top
Aloha Friemler,

ja Urlaub ist gut, genieße ich auch derzeit face-wink

Gefiel dir eine FOR /L nicht? Du weißt schon so à la for /l %%s in (1,1,%NDestDirs%) do set "DestDir%%s=E:\Verzeichnis %%s"

Rein für's Anlegen face-wink

greetz André
Member: Friemler
Friemler Dec 27, 2011 at 13:50:34 (UTC)
Goto Top
Hi André,

stimmt, wäre eine Möglichkeit. Aber ein gutes Essen macht träge (anscheinend auch im Kopf) face-wink .

Gruß
Friemler
Member: Biber
Biber Dec 31, 2011 at 15:04:52 (UTC)
Goto Top
Sache ma', Fritzel,

meinst du, du könntest noch diese Jahr, zum Beispiel während das Raclette heute abend vorgeheizt wird, einen minzefarbenen Haken für die vielen hilfreichen Antworten vergeben?

Oder sind noch Fragen offen?

Grüße
Biber
Member: fritzel
fritzel Jan 05, 2012 at 12:50:39 (UTC)
Goto Top
Hallo zusammen und ein frohes neues noch face-smile

sorry, war im Urlaub "verschwunden", deshalb keine Reaktion....

sooo, wollte nun mal testen, und habe das Script angepasst, erhalte jedoch leider folgende Fehlermeldung:


[URL=http://s1.directupload.net/file/d/2760/zhpgco4w_gif.htm][IMG]http://s1.directupload.net/images/120105/temp/zhpgco4w.gif[/IMG][/URL]
Member: Skyemugen
Skyemugen Jan 05, 2012 at 14:04:47 (UTC)
Goto Top
... dir ist schon klar, dass das hier eine batch ist und kein vbs?
Member: fritzel
fritzel Jan 09, 2012 at 10:28:42 (UTC)
Goto Top
hello again, ups - "wer lesen kann ist klar im Vorteil" face-smile

als "BATCH" funktioniert das ganze super, danke euch allen schonmal.

Aber:

wie kann ich das BATCH nun so erweitern, das es sich "merkt" in welches Verzeichnis er das letzte mal kopiert hat (z.B: x05) und beim wiederaufruf dann ensprechend weitermacht (in diesem Falle dann X06) ?
Member: fritzel
fritzel Jan 12, 2012 at 18:27:04 (UTC)
Goto Top
... lässt sich das nicht realisieren ? face-sad
Member: fritzel
fritzel Jan 16, 2012 at 22:14:27 (UTC)
Goto Top
warte geduldig auf Hilfe von den vielen Profis hier...
Member: Friemler
Friemler Jan 18, 2012 at 17:15:48 (UTC)
Goto Top
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 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