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

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

Frage Entwicklung Batch & Shell

Mitglied: fritzel

fritzel (Level 1) - Jetzt verbinden

27.12.2011, aktualisiert 11:51 Uhr, 2416 Aufrufe, 16 Kommentare

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
Mitglied: PhilippBeitz
27.12.2011 um 12:57 Uhr
Suchst du dafür ein Tool ? Oder brauchst du ein Script ?
Bitte warten ..
Mitglied: fritzel
27.12.2011 um 13:02 Uhr
Hallo Philipp,

suche hierfür ein Script.
Bitte warten ..
Mitglied: Friemler
27.12.2011 um 13:08 Uhr
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).

01.
@echo off & setlocal 
02.
 
03.
set "SrcDir=." 
04.
set "BackupDir=E:\Backup" 
05.
 
06.
set "NDestDirs=10" 
07.
set "DestDir1=E:\Verzeichnis 1" 
08.
set "DestDir2=E:\Verzeichnis 2" 
09.
set "DestDir3=E:\Verzeichnis 3" 
10.
set "DestDir4=E:\Verzeichnis 4" 
11.
set "DestDir5=E:\Verzeichnis 5" 
12.
set "DestDir6=E:\Verzeichnis 6" 
13.
set "DestDir7=E:\Verzeichnis 7" 
14.
set "DestDir8=E:\Verzeichnis 8" 
15.
set "DestDir9=E:\Verzeichnis 9" 
16.
set "DestDir10=E:\Verzeichnis 10" 
17.
 
18.
for /f "tokens=1* delims=:" %%a in ('dir /b /a:-d-h-s /o:ne "%SrcDir%" 2^>NUL ^| findstr /n "^"') do ( 
19.
  call :ProcessFile %%a "%%b" 
20.
21.
 
22.
exit /b 
23.
 
24.
 
25.
:ProcessFile 
26.
  set /a i=(%1-1)%%%NDestDirs%+1 
27.
  echo copy "%SrcDir%\%~2" "%BackupDir%" 
28.
  call echo move "%SrcDir%\%~2" "%%DestDir%i%%%" 
29.
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
Bitte warten ..
Mitglied: fritzel
27.12.2011 um 13:22 Uhr
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
Bitte warten ..
Mitglied: Skyemugen
27.12.2011 um 13:27 Uhr
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*
Bitte warten ..
Mitglied: Friemler
27.12.2011 um 13:34 Uhr
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
Bitte warten ..
Mitglied: Friemler
27.12.2011 um 13:43 Uhr
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 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
Bitte warten ..
Mitglied: Skyemugen
27.12.2011 um 14:41 Uhr
Aloha Friemler,

ja Urlaub ist gut, genieße ich auch derzeit

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

greetz André
Bitte warten ..
Mitglied: Friemler
27.12.2011 um 14:50 Uhr
Hi André,

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

Gruß
Friemler
Bitte warten ..
Mitglied: Biber
31.12.2011 um 16:04 Uhr
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
Bitte warten ..
Mitglied: fritzel
05.01.2012 um 13:50 Uhr
Hallo zusammen und ein frohes neues noch

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]
Bitte warten ..
Mitglied: Skyemugen
05.01.2012 um 15:04 Uhr
... dir ist schon klar, dass das hier eine batch ist und kein vbs?
Bitte warten ..
Mitglied: fritzel
09.01.2012 um 11:28 Uhr
hello again, ups - "wer lesen kann ist klar im Vorteil"

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) ?
Bitte warten ..
Mitglied: fritzel
12.01.2012 um 19:27 Uhr
... lässt sich das nicht realisieren ?
Bitte warten ..
Mitglied: fritzel
16.01.2012 um 23:14 Uhr
warte geduldig auf Hilfe von den vielen Profis hier...
Bitte warten ..
Mitglied: Friemler
18.01.2012 um 18:15 Uhr
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.

01.
@echo off & setlocal 
02.
 
03.
::********** Config-Variablen ********** 
04.
set "SrcDir=E:\Test\Quelle" 
05.
set "BackupDir=E:\Test\Backup" 
06.
 
07.
set "NDestDirs=10" 
08.
set "DestDir1=E:\Test\Verz1" 
09.
set "DestDir2=E:\Test\Verz2" 
10.
set "DestDir3=E:\Test\Verz3" 
11.
set "DestDir4=E:\Test\Verz4" 
12.
set "DestDir5=E:\Test\Verz5" 
13.
set "DestDir6=E:\Test\Verz6" 
14.
set "DestDir7=E:\Test\Verz7" 
15.
set "DestDir8=E:\Test\Verz8" 
16.
set "DestDir9=E:\Test\Verz9" 
17.
set "DestDir10=E:\Test\Verz10" 
18.
::************************************** 
19.
 
20.
::Aus einer INI-Datei, die den gleichen Namen wie das Script hat, 
21.
::wird die Nummer des letzten Verzeichnisses ausgelesen, in das 
22.
::beim letzten Scriptlauf eine Datei kopiert wurde. 
23.
::In der INI-Datei können Einträge für verschiedene Quellverzeichnisse 
24.
::stehen. Ein Eintrag ist nach dem Muster 
25.
::      PfadZumQuellverzeichnis=Nummer 
26.
::aufgebaut. 
27.
set /a Offset=0 
28.
 
29.
if exist "%~dpn0.ini" ( 
30.
  for /f "usebackq tokens=1* delims==" %%a in ("%~dpn0.ini") do ( 
31.
    if "%%a" equ "%SrcDir%" ( 
32.
      set /a Offset=%%b 
33.
34.
35.
36.
 
37.
::Aus der eingelesenen Nummer mit der Modulo-Funktion den Offset für 
38.
::den aktuellen Scriptlauf berechnen. 
39.
set /a Offset=Offset%%NDestDirs 
40.
 
41.
::Dateien im Quellverzeichnis verarbeiten 
42.
for /f "tokens=1* delims=:" %%a in ('dir /b /a:-d-h-s /o:ne "%SrcDir%" 2^>NUL ^| findstr /n "^"') do ( 
43.
  call :ProcessFile %%a "%%b" 
44.
45.
 
46.
::Die alte INI-Datei zeilenweise auslesen und dabei nach der Zeile 
47.
::suchen, die zum aktuellen Quellverzeichnis gehört. Diese Zeile 
48.
::wird mit aktualisiertem Wert in eine temporäre INI-Datei geschrieben. 
49.
::Alle anderen Zeilen werden unverändert in diese Datei geschrieben. 
50.
::Falls die INI-Datei noch nicht existiert, wird eine temporäre 
51.
::INI-Datei angelegt, die nur den Eintrag für das aktuelle Quell- 
52.
::verzeichnis enthält. 
53.
if exist "%~dpn0.ini" ( 
54.
  for /f "usebackq tokens=1* delims==" %%a in ("%~dpn0.ini") do ( 
55.
    if "%%a" neq "%SrcDir%" ( 
56.
      >>"%~dpn0_new.ini" echo %%a=%%b 
57.
    ) else ( 
58.
      >>"%~dpn0_new.ini" echo %%a=%i% 
59.
60.
61.
) else ( 
62.
  > "%~dpn0_new.ini" <NUL set /p "=%SrcDir%=%i%" 
63.
  >>"%~dpn0_new.ini" echo. 
64.
65.
 
66.
::Die temporäre INI-Datei umbenennen und dabei die ggf. schon existierende 
67.
::alte INI-Datei ohne Nachfrage überschreiben. 
68.
move /y "%~dpn0_new.ini" "%~dpn0.ini" > NUL 
69.
 
70.
::Script Ende 
71.
exit /b 
72.
 
73.
 
74.
::Unterprogramm 
75.
:ProcessFile 
76.
  set /a i=(%1-1+Offset)%%NDestDirs+1 
77.
  echo copy "%SrcDir%\%~2" "%BackupDir%" 
78.
  call echo move "%SrcDir%\%~2" "%%DestDir%i%%%" 
79.
exit /b

Gruß
Friemler
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Batch & Shell
gelöst Dateien bezugnehmend auf Teil des Namens verschieben (8)

Frage von pbelcl zum Thema Batch & Shell ...

Batch & Shell
Dateien trotz Verwendung kopieren (2)

Frage von 112Timo zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...