Batch Dateien in Abhängigkeit des Dateinamens in Zielverzeichnis verschieben

kai4

Newbie
Registriert
Juni 2024
Beiträge
2
Hallo zusammen,

in einem Verzeichnis liegen mehrere Kontoauszugsdateien, die dort automatisiert täglich abgelegt werden.
Aufbau des Dateinamens ist [Buchungstag Jahr_Monat_Tag]__[Kontonummer]_[...]
Beispiel:
2024_06_10_12345.pdf
2024_06_10_23456.pdf
2024_06_10_34567.pdf
...

Diese Dateien sollen in ein Zielverzeichnis verschoben werden, abhängig vom Dateinamen, z.B. nach Kontonummer.
Das lässt sich mit dem MOVE-Befehl ja relativ einfach umsetzen:
Code:
MOVE %sourceDir%\*_12345*.pdf "%outputDir%\12345"
MOVE %sourceDir%\*_23456*.pdf "%outputDir%\23456"
MOVE %sourceDir%\*_34567*.pdf "%outputDir%\34567"

Im Zielverzeichnis ist nun aber die Jahreszahl mitenthalten, z.B.
Code:
set outputDir=\\SERVER\Auszüge\2024\12345\

Gibt es eine Möglichkeit, von der jeweiligen Datei, wenn sie verschoben wird, den Namen auszulesen? Und wenn ja, wie?
Denn dann würde ich die ersten 4 Stellen einer Variable zuweisen, die dann im gesetzten Zielverzeichnis auftaucht.
Vorteil hiervon wäre, ich müsste zum Jahreswechsel nicht manuell eingreifen, um die Zielverzeichnisse zu ändern.
 
Mit %variable:~3,2% kann man sich zB ab dem 3. Zeichen 2 Zeichen aus dem Wert der Variable rausziehen. Wenn du also deine Dateien in einer For-Schleife durchläufst und dir den Namen holst, kannst du ihn nach Belieben aufsplitten. Innerhalb einer Schleife gilt jedoch eine Besonderheit bei Batch: Man muss die Variable dann mit ! umschließen statt mit % und zusätzlich muss am Anfang der Batch setlocal EnableDelayedExpansion stehen.

So ungefähr:

Code:
@ECHO OFF
SETLOCAL EnableDelayedExpansion

SET sourceDir=C:\buchungen
SET outputDir=\\server\buchungen

REM In das Quellverzeichnis wechseln
pushd %sourceDir%

REM PDF-Dateien loopen
FOR %%a IN (*.pdf) DO (
   REM Dateinamen zwischenspeichern (nxa bedeutet fileName + eXtension von a, also ohne Pfad)
   SET dateiname=%%~nxa

   REM Jahr aus dem Dateinamen extrahieren (0, 4 => ab Start 0 genau 4 Zeichen)
   SET jahr=!dateiname:~0,4!

   REM Nummer aus Dateinamen extrahieren (-5 => ab Ende 5 Zeichen)
   SET kontonummer=!dateiname:~-5!

   REM Datei verschieben (hier a ohne nx davor, weil wir den vollständigen Pfad brauchen)
   move %%a %outputDir%\!jahr!\!kontonummer!\
)

REM Wieder zurück ins Ausgangsverzeichnis
popd
Code aus dem Handgelenk geschrieben und nicht ausprobiert. Fehler ggfs selbst korrigieren.

Anmerkung: Beim move-Befehl habe ich bewusst %outputDir% verwendet, um zu zeigen, dass es bei einer Variable, die außerhalb der Schleife verändert wird, keine Rolle spielt. Nur dann, wenn eine Variable innerhalb der Schleife einen neuen Wert bekommt, muss man den veränderten Wert mit !var! abrufen, so wie eben bei dateiname, jahr und kontonummer.
 
Zuletzt bearbeitet: (erweitert und kommentiert)
  • Gefällt mir
Reaktionen: simpsonsfan, Marco01_809, s1ave77 und 3 andere
Ich hab das Skript nochmal etwas angepasst, weil for die Datei inkl Pfad durchläuft. Dann hätte der Jahres-Substring nur Teile des Pfades ausgegeben. Das habe ich jetzt korrigiert, indem ich mir direkt den Dateinamen aus dem vollständigen Pfad geschnappt habe.

Umso wichtiger ist es daher, dass du das Skript bitte nicht einfach so auf produktive Daten loslässt. Setze zB ein echo vor den move-Befehl, um zu sehen ob das richtige rauskäme. Erst wenn du dir sicher bist, dass die Pfade und Variablen stimmen, kannst du das Skript scharf schalten. Sonst schiebst du womöglich deine Daten durch die Gegend und findest sie nicht wieder.

Man darf bei Batch eines nie vergessen: Batch is a bitch!
Batch mag aussehen wie eine Skriptsprache, aber es ist nur eine Stapelverarbeitung, also das stupide Nacheinanderausführen von Befehlen, die man sonst von Hand eingegeben hätte - nicht mehr und nicht weniger. Dadurch kommen zum Teil sehr merkwürdige Phänomene zum Vorschein, wie zB die Krücke mit %% und !!
 
  • Gefällt mir
Reaktionen: andy_m4, s1ave77, kai4 und 2 andere
@Raijin Perfekt! Vielen Dank!! Genau das habe ich gesucht, und dabei auch noch dazugelernt.
Danke auch fürs ausführliche Kommentieren Deines Codes (so habe ich dann auch ~nxa verstanden) und auch für Deine anderen Ausführungen. Habs auf meine restlichen Bedürfnisse angepasst und ausprobiert (mit Testdaten und einem copy- statt move-Befehl =)) Funktioniert hervorragend.
 
  • Gefällt mir
Reaktionen: Der Lord, Raijin und areiland
Zurück
Oben