Ich hatte die Anforderung, dass automatisch erzeugte PDF-Dateien aus einem ERP-System, beginnend mit einer 5 stelligen Projektnummer und einem Unterstrich, in jeweils einen Projekt-Ordner, bestehend aus dieser 5stelligen Projektnummer, verschoben werden mussten. Nicht vorhandene Projekt-Ordner sollten dabei automatisch erzeugt werden. Klingt erstmal einfach…
String-Operationen habe ich in diesem Beitrag schon kurz angeschnitten und auch den For-Befehl in diesem Beitrag.
Für den ersten Schnellschuß erzeugte ich diese kleine Batchdatei.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
echo off CHCP 1252 set Pfad="d:\Listen\Übersicht" setlocal enabledelayedexpansion for %%i in (%Pfad%"\?????_*.*") do ( set "var=%%~nxi" if not exist %Pfad%"\!var:~0,5!" ( mkdir %Pfad%"\!var:~0,5!" ) if exist %Pfad%"\!var:~0,5!" ( move "%%i" "%Pfad%\!var:~0,5!\" ) ) |
Was passiert in diesem Skript.
Mit CHCP1252
wird das Verwenden von Umlauten ermöglicht, auch wenn sie im laufendem Skript selber nicht/falsch angezeigt werden
set Pfad
legt das Arbeitsverzeichnis fest.
Eine der wichtigeren Angaben ist hier setlocal enabledelayedexpansion
. Dieser wird benötigt, weil die set
-Angaben innerhalb einer for
-Schleife nicht korrekt funktionieren. Hier eine schöne Beschreibung.
In der for
-Schleife rufe ich nun alle Dateien auf, welche mit einem „_“ nach der 5ten Stelle bezeichnet sind.
Die Variable var
bekommt den angepassten inhalt von Variable i
(n=Dateiname, x=Extension), welche nun nicht den Pfad, sondern nur noch den kopletten Dateinamen enthält.
Danach lege ich, wenn noch nicht vorhanden, im Pfad ein Verzeichnis mit den Namen der ersten 5 Stellen des Dateinamens (der Projektnummer) an (!var:~0,5!) (Stringoperationen). Dass Hier jetzt Ausrufezeichen anstelle der Prozentzeichen genutzt werden, liegt an der oben aktivierten Funktion setlocal enabledelayedexpansion
.
Die folgende if
-Anweisung macht die gleiche prüfung wie die if
-Anweisung davor. Eigentlich hätte ich sie weg lassen können und den move
-Befehl mit in die obere Abfrage integrieren können. Sollte aber aus irgendeinem Grund das Verzeichnis nicht angelegt werden, so habe ich hier nochmal eine Kontrolle. Müsste aber nicht sein.
Das Skript habe ich 1:1 übernommen und es funktioniert wie beschrieben auch noch in 2021.
Da ich keine Stringoperationen brauche (der gesamte Dateiname soll genommen werden), habe ich ersetzt:
%Pfad%“\!var:~0,5!“ durch %Pfad%“\!var!“
Nun lautet der Fehler je Datei:
Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
0 Datei(en) verschoben.
Alternativ habe ich die Stringoperation belassen, aber statt 5 nun 150 eingestellt. (%Pfad%“\!var:~0,5!“ ist nun %Pfad%“\!var:~0,150!“)
Hier ist der Fehler identisch. Ich habe trotz Tüftelei und Lieratur dazu keine Idee zur Behebung des Fehlers.
Was ist falsch?