Batch Ausgewählte Ordner per Skript verschieben

Ex4mp1e

Lt. Junior Grade
Registriert
Mai 2016
Beiträge
506
Moin zusammen,

ich bastel aktuell an einem Batch-Script das per Autotask alle 15 Minuten eine Liste an Dateipfaden (txt-Dokument) durchgehen soll, und dann die entsprechenden Verzeichnisse in ein Netzlaufwerk kopieren soll (eingebundene Nextcloud).

Die "verzeichnisse.txt" sieht folgendermaßen aus:

Code:
"C:\Dateipfad\2022\1234 - Beispiel\03 - Daten\JPG"
"C:\Dateipfad\2022\1234 - Beispiel\03 - Daten\DOC"
"C:\Dateipfad\2022\1234 - Beispiel\03 - Daten\PDF"
"C:\Dateipfad\2022\1234 - Beispiel\03 - Daten\XML"
"C:\Dateipfad\2022\5678 - Muster\03 - Daten\JPG"
"C:\Dateipfad\2022\5678 - Muster\03 - Daten\DOC"
"C:\Dateipfad\2022\5678 - Muster\03 - Daten\PDF"
"C:\Dateipfad\2022\5678 - Muster\03 - Daten\XML"
"C:\Dateipfad\2022\9999 - Exempel\03 - Daten\JPG"
"C:\Dateipfad\2022\9999 - Exempel\03 - Daten\DOC"
"C:\Dateipfad\2022\9999 - Exempel\03 - Daten\PDF"
"C:\Dateipfad\2022\9999 - Exempel\03 - Daten\XML"

In dem Dateipfad "C:\...\03 - Daten" gibt es noch mehr Unterordner und auch einzelne Dateien. Die sollen nicht kopiert werden, nur die entsprechenden vier Ordner.

Die Zielpfade sehen dann folgendermaßen aus:

"N:\2022\1234 - Beispiel\03- Daten\JPG"
"N:\2022\1234 - Beispiel\03- Daten\DOC"
"N:\2022\1234 - Beispiel\03- Daten\PDF"
"N:\2022\1234 - Beispiel\03- Daten\XML"


Es wäre aber auch kein Problem, wenn die Dateipfade im Ziel bis auf den Laufwerksbuchstaben 1:1 so lauten würden, wie die der Quelle.
Einmaliges manuelles Anlegen der Zielverzeichnisse ist ebenfalls kein Problem.


Was ich bisher gebastelt habe ist folgendes:

Code:
for /f "delims=;" %%z in (C:\Dateipfad\2022\verzeichnisse.txt) do (
robocopy %%z "N:\2022" *.* /E /IPG:5 /R:3 /W:10 /NP /TEE
)

Der Schnipsel Code läuft durch meine txt, ignoriert alle nervigen Leerzeichen, und packt mir immer den Inhalt einer Zeile in Variable z.
Danach führt es für jedes z einen Robocopy-Befehl aus.
Soweit, so gut. Leider kopiert Robocopy natürlich nicht den Ordner, sondern nur den Inhalt.
Außerdem schmeißt das Script die Inhalte meiner Ordner unsortier in N:\2022.

Ich bräuchte jetzt Unterstützung dabei, dass ich im Script irgendwie die Ziele der robocopy-Jobs ebenfalls dynamisch gestalte, damit die Dateien in korrekte Unterordner geschmissen werden.
Ich hab das ganze mal mit einer weiteren for-Schleife innerhalb der ersten for-Schleife versucht, aber das hat natürlich nicht geklappt...
Mir fehlt da also gerade sowohl theoretisch die Idee, wie man das umsetzt, als auch ggfs. praktisch das Wissen, mit welchen Befehlen ich das programmiere.

Ich bedanke mich schon mal für jeden der ein wenig Hirnschmalz für mein Problem erübrigt. :D

LG
Ex4
 
Ex4mp1e schrieb:
Es wäre aber auch kein Problem, wenn die Dateipfade im Ziel bis auf den Laufwerksbuchstaben 1:1 so lauten würden, wie die der Quelle.
Wenn dir das reicht, dann hier eine simple Lösung:

Code:
@echo off
SETLOCAL EnableDelayedExpansion

for /f "delims=;" %%z in (C:\Dateipfad\2022\verzeichnisse.txt) do (
   SET srcfolder=%%z
   SET dstfolder=d:\!srcfolder:~3!
   ECHO robocopy "!srcfolder!" "!dstfolder!" *.* /E /IPG:5 /R:3 /W:10 /NP /TEE
)

Ich habe im Prinzip nur vom eingelesenen Pfad (%%z) die ersten drei Zeichen abgeschnitten(*) c:\ und dafür entsprechend d:\ davorgestellt.

Achtung! In meiner verzeichnisse.txt habe ich KEINE "" um die Pfade!

Robocopy habe ich sicherheitshalber als ECHO ausgegeben. Prüfe also die Ausgabe auf Korrektheit und passe das Skript entsprechend an bevor du es scharfschaltest und die Daten womöglich im nirgendwo landen.... Ich hab das nämlich nicht wirklich ausprobiert, aber es sollte als Ausgangsbasis taugen.


(*) Natürlich kann man auch nur 1 Zeichen abschneiden, aber ich empfinde Pfade, die aus Variablen gebildet werden, als übersichtlicher, wenn sie trotz allem mit : und \ geschrieben sind.
 
  • Gefällt mir
Reaktionen: Der Lord, PHuV, Ex4mp1e und eine weitere Person
Raijin schrieb:
Achtung! In meiner verzeichnisse.txt habe ich KEINE "" um die Pfade!
Und das funktioniert trotzdem? Da sind ja Leerzeichen im Dateipfad...
Aber ich werds mal probieren, danke dir.
Edit: Ah, du hast einfach Anführungszeichen um die Variablen gebaut. Kluk! ^^

Und klar, bevor ich irgendwas live durchs System jage teste ich es auf jeden Fall. :D Aber danke trotzdem für den Reminder. :)
Ergänzung ()

Danke, funktioniert perfekt. Test war erfolgreich. :)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Raijin
Ex4mp1e schrieb:
Edit: Ah, du hast einfach Anführungszeichen um die Variablen gebaut. Kluk! ^^
Jep. Auch da achte ich darauf, dass das besser verständlich ist. Die "" werden erst interessant, wenn der Pfad als Parameter übergeben wird, weil der entsprechende Befehl (hier: robocopy) ansonsten nach dem Leerzeichen trennt und den Rest des Pfades als nächsten Parameter interpretiert. Bis zu diesem Moment möchte man den Pfad aber womöglich noch bearbeiten und beispielsweise einen Unterordner hinzufügen. Es ist etwas unpraktisch, wenn man dann vorher noch die Tüddelchen aus der Variable löschen muss - insbesondere bei längeren Skripten wo dann scheinbar willkürlich plötzlich das letzte Zeichen aus der Variable gelöscht wird...

Das ist aber reine Geschmackssache. Ich hab mir das so angewöhnt, weil Batch eh schon unübersichtlich genug ist.
 
  • Gefällt mir
Reaktionen: Ex4mp1e
Frage, da ich zwar öfters Batch programmiere, aber hier immer wieder (im Vergleich zur Bash) unsicher bin.
Code:
   SET dstfolder=d:\!srcfolder:~3!
   ECHO robocopy "!srcfolder!" "!dstfolder!" *.* /E /IPG:5 /R:3 /W:10 /NP /TEE
Warum muß man bei SET nicht quoten, wenn die Variable Leerzeichen enthält? Nimmt SET immer die ganze Zeile bis zum Zeilenende dann als Input?
 
SET nimmt alles was nach dem = folgt. Es gibt ja keine weiteren Parameter, die durch Leerzeichen falsch interpretiert werden könnten.

Tüddelchen sind bei Batch (fast) nur dann erforderlich, wenn eine Zeichenfolge mit Leerzeichen explizit als Ganzes interpretiert werden soll, weil die Zeichenkette zB als Parameter an eine Anwendung übergeben wird.
Streng genommen müsste man vor Verwendung von Pfaden auch noch prüfen ob am Ende ein \ steht oder nicht, weil zB Copy bei Zielpfaden ohne \ am Ende immer meckert: "Ist das eine Datei oder ein Ordner????" :D

Aber: Batch is a bitch und deswegen gibt es bei Batch gefühlt mehr Ausnahmen von den Regeln als es überhaupt Regeln gibt. Es würde mich also nicht wundern, wenn hier jemand ein Beispiel anführen würde, bei dem man auch bei SET quoten muss......
 
  • Gefällt mir
Reaktionen: PHuV
Aus diesem Grund sollte man SET eigentlich quoten, wie hier gezeigt
set "Variable=12345"
Wenn man es nicht macht, kann ein Leerzeichen/Sonderzeichen am Ende des Strings auch mit in die Variable rutschen, weil man es im Editor nicht sieht.
Beispiel (Leerzeichen hinter den Zahlen beachten)
set Variable=12345
ergibt bei echo .%Variable%.
.12345 .

Normalerweise ist es aber kein Problem, weil man den zu setzenden Inhalt mit einem Return abschließt.
 
  • Gefällt mir
Reaktionen: PHuV und Raijin
In der Tat ein gutes Beispiel. Allerdings quotest du die komplette Zuweisung, was ja nochmal ein anderer (Spezial)Fall ist. Noch ein Grund mehr, gar nicht erst mit Batch anzufangen, wenn man nicht schon Jahr(zehnt)e daran gewöhnt ist... Mehr Ausnahmen als Regeln......
 
  • Gefällt mir
Reaktionen: PHuV
Zurück
Oben