Dateien verschieben anhand vom Dateinamen
Hallo Zusammen,
Ich habe das Problem, dass ich von einem FTP Server automatisch Dateien in ein Verzeichnis kopiere und diese dann anhand ihres Dateinamen in ein anderes Verzeichnis verschieben möchte.
Die jeweils ersten sechs Zeichen der Dateien sind/sollen den bereits vorhandenen Ordnernamen darstellen und jeweils dahin verschoben werden.
Dateien sehen so ähnlich aus, XXXXXX steht für eine Buchstaben/Zahlen Kombination. Die Ordner gibt es bereits.
XXXXXX_info.txt
XXXXXX_grafik.jpg
XXXXXX_noch_mehr_info.pdf
Toll wäre es auch noch, wenn man eine Logdatei mit Tagesdatum hätte zur Kontrolle.
Im Post Per Batch Dateinamen prüfen und Datei kopieren wird zwar ein ähnliches Problem beschrieben, aber den Schritt mit der Datei würde ich gerne überspringen.
Ich habe das Problem, dass ich von einem FTP Server automatisch Dateien in ein Verzeichnis kopiere und diese dann anhand ihres Dateinamen in ein anderes Verzeichnis verschieben möchte.
Die jeweils ersten sechs Zeichen der Dateien sind/sollen den bereits vorhandenen Ordnernamen darstellen und jeweils dahin verschoben werden.
Dateien sehen so ähnlich aus, XXXXXX steht für eine Buchstaben/Zahlen Kombination. Die Ordner gibt es bereits.
XXXXXX_info.txt
XXXXXX_grafik.jpg
XXXXXX_noch_mehr_info.pdf
Toll wäre es auch noch, wenn man eine Logdatei mit Tagesdatum hätte zur Kontrolle.
Im Post Per Batch Dateinamen prüfen und Datei kopieren wird zwar ein ähnliches Problem beschrieben, aber den Schritt mit der Datei würde ich gerne überspringen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 151812
Url: https://administrator.de/forum/dateien-verschieben-anhand-vom-dateinamen-151812.html
Ausgedruckt am: 20.04.2025 um 21:04 Uhr
4 Kommentare
Neuester Kommentar
Hallo Kochkaes,
hier ein Skript zur Lösung Deines Problems:
In den Zeilen 7 bis 13 werden alle Einstellungen für das Skript vorgenommen. Diese Variablen musst Du anpassen.
In den Zeilen 16 bis 23 wird ein temporäres FTP-Skript erzeugt, das alle benötigten Befehle enthält. OPEN öffnet die Verbindung zu einem FTP-Server mit der angegebenen Adresse. USER führt die Anmeldung mit den angegebenen Login-Daten durch. CD wechselt auf dem FTP-Server ins Verzeichnis, aus dem die Dateien heruntergeladen werden sollen. LCD wechselt das Verzeichnis auf dem lokalen Rechner, dort werden die heruntergeladenen Dateien abgelegt. BINARY schaltet in den binären Übertragungsmodus. Dadurch wird vermieden, das die heruntergeladenen Dateien (z..B. Bilder, Programme, PDF-Dateien) Datensalat enthalten. PROMPT schaltet die Einzelbestätigung zum Herunterladen jeder einzelnen Datei aus. MGET lädt mit der Dateimaske *.* alle Dateien herunter, die eine Erweiterung haben (z.B. .TXT oder .PDF). BYE schließt die Verbindung zum FTP-Server und beendet den FTP-Befehl.
In Zeile 25 wird der FTP-Befehl ausgeführt. -N verhindert eine automatische Anmeldung am Server und macht die Benutzung des FTP-Subbefehls USER möglich. -S:"Dateiname" gibt an, das die Datei "Dateiname" ein FTP-Skript mit den auszuführenden Befehlen enthält. Nach Ausführung des Skripts wird das Skript in Zeile 26 wieder gelöscht.
In Zeile 29 werden mit DIR die heruntergeladenen Dateien aufgelistet und in Zeile 30 jeder Dateiname einzeln an die Variable FileName zugewiesen. Der Parameter /b bei DIR bewirkt, das nur die Dateinamen gelistet werden ohne den üblichen Header (Verzeichnis von ... usw.) und ohne die Zusammenfassung (x Dateien, x Verzeichnisse, x Bytes frei), der Parameter /a:-d verhindert das Listen von Directories. In Zeile 31 wird das Unterprogramm ProcessFile aufgerufen.
In Zeile 34 wird das Batchskript beendet.
Im Unterprogramm ProcessFile wird in Zeile 39 der Zielpfad zusammengebaut. Von FileName werden dabei ab Offset 0 die 6 folgenden Zeichen verwendet. In Zeile 40 wird der neue Dateiname aus allen Zeichen von FileName ab dem Offset 7 (8. Zeichen, hinter dem Unterstrich in XXXXXX_YYYYY.ZZZ) bis zum Ende zusammengesetzt. In Zeile 41 wird die Datei verschoben und dabei umbenannt. Zeile 42 springt aus dem Unterprogramm zurück in die aufrufende FOR-Schleife.
Gruß
Friemler
hier ein Skript zur Lösung Deines Problems:
@echo off
setlocal disabledelayedexpansion
cls
set "FTPGetFiles=%TEMP%\ftpcmd.txt"
set "FTPServer=ftp.DeinServer"
set "Usr=anonymous"
set "Pwd=anonymous@example.com"
set "RemoteDir=."
set "LocalDir=E:\Test"
set "Repository=D:\Data"
> "%FTPGetFiles%" echo open %FTPServer%
>>"%FTPGetFiles%" echo user %Usr% %Pwd%
>>"%FTPGetFiles%" echo cd "%RemoteDir%"
>>"%FTPGetFiles%" echo lcd "%LocalDir%"
>>"%FTPGetFiles%" echo binary
>>"%FTPGetFiles%" echo prompt
>>"%FTPGetFiles%" echo mget *.*
>>"%FTPGetFiles%" echo bye
ftp -n -s:"%FTPGetFiles%"
del "%FTPGetFiles%"
for /f "delims=" %%f in ('dir /b /a:-d "%LocalDir%\*.*"') do (
set "FileName=%%f"
call :ProcessFile
)
exit /b
:ProcessFile
set "DestFolder=%Repository%\%FileName:~0,6%"
set "NewFileName=%FileName:~7%"
move "%LocalDir%\%FileName%" "%DestFolder%\%NewFileName%"
exit /b
Einschränkungen
- Wenn sich im Verzeichnis auf dem FTP-Server Unterverzeichnisse befinden, deren Namen einen Punkt enthalten (z.B. Meine.Texte), wird eine Fehlermeldung ausgegeben. Der Name eines solchen Verzeichnisses wird als Dateiname interpretiert. Dadurch wird versucht, das Verzeichnis als Datei herunterzuladen, was zu einer Fehlermeldung führt. Das Skript wird aber trotzdem weiter ausgeführt.
- Dateien ohne Dateierweiterung werden nicht heruntergeladen.
- Die Zielverzeichnisse auf dem lokalen Rechner müssen sich alle im gleichen Eltern-Verzeichnis befinden (Variable Repository).
- Die Verarbeitung von Dateinamen, die Prozentzeichen enthalten, macht, wie üblich unter Batchskript, Probleme.
Erklärung
In den Zeilen 7 bis 13 werden alle Einstellungen für das Skript vorgenommen. Diese Variablen musst Du anpassen.In den Zeilen 16 bis 23 wird ein temporäres FTP-Skript erzeugt, das alle benötigten Befehle enthält. OPEN öffnet die Verbindung zu einem FTP-Server mit der angegebenen Adresse. USER führt die Anmeldung mit den angegebenen Login-Daten durch. CD wechselt auf dem FTP-Server ins Verzeichnis, aus dem die Dateien heruntergeladen werden sollen. LCD wechselt das Verzeichnis auf dem lokalen Rechner, dort werden die heruntergeladenen Dateien abgelegt. BINARY schaltet in den binären Übertragungsmodus. Dadurch wird vermieden, das die heruntergeladenen Dateien (z..B. Bilder, Programme, PDF-Dateien) Datensalat enthalten. PROMPT schaltet die Einzelbestätigung zum Herunterladen jeder einzelnen Datei aus. MGET lädt mit der Dateimaske *.* alle Dateien herunter, die eine Erweiterung haben (z.B. .TXT oder .PDF). BYE schließt die Verbindung zum FTP-Server und beendet den FTP-Befehl.
In Zeile 25 wird der FTP-Befehl ausgeführt. -N verhindert eine automatische Anmeldung am Server und macht die Benutzung des FTP-Subbefehls USER möglich. -S:"Dateiname" gibt an, das die Datei "Dateiname" ein FTP-Skript mit den auszuführenden Befehlen enthält. Nach Ausführung des Skripts wird das Skript in Zeile 26 wieder gelöscht.
In Zeile 29 werden mit DIR die heruntergeladenen Dateien aufgelistet und in Zeile 30 jeder Dateiname einzeln an die Variable FileName zugewiesen. Der Parameter /b bei DIR bewirkt, das nur die Dateinamen gelistet werden ohne den üblichen Header (Verzeichnis von ... usw.) und ohne die Zusammenfassung (x Dateien, x Verzeichnisse, x Bytes frei), der Parameter /a:-d verhindert das Listen von Directories. In Zeile 31 wird das Unterprogramm ProcessFile aufgerufen.
In Zeile 34 wird das Batchskript beendet.
Im Unterprogramm ProcessFile wird in Zeile 39 der Zielpfad zusammengebaut. Von FileName werden dabei ab Offset 0 die 6 folgenden Zeichen verwendet. In Zeile 40 wird der neue Dateiname aus allen Zeichen von FileName ab dem Offset 7 (8. Zeichen, hinter dem Unterstrich in XXXXXX_YYYYY.ZZZ) bis zum Ende zusammengesetzt. In Zeile 41 wird die Datei verschoben und dabei umbenannt. Zeile 42 springt aus dem Unterprogramm zurück in die aufrufende FOR-Schleife.
Gruß
Friemler