Dateien auf Grund des Dateinamens in Ordner verschieben
Hallo Leute, ich stöbere nun seit ca 3 Tagen durch die Foren ohne eine Lösung für mein Problem zu finden
folgendes.
in einem Ordner liegen mehrere *.tif Dokumente welche folgende Namensgebung haben:
Kunde YYYY_MM_TT Dokumentenart
sprich
Max Musterman 2009_05_12 Angebot.tif
oder
Max Musterman 2009_05_12 Bestellung.tif
der entsprechende Ordner wird per watchdir überwacht und bei einer Änderung soll dann diese batch gestartet werden.
Was soll diese Batch machen?
die Batch soll die Dateien nach Dokumentenart in die Entsprechenden Ordner verschieben.
ich habe schon verschiedene Lösungsmöglichkeiten getestet, jedoch schaffe ich es einfach nicht die *.tif-Dateien nach "Dokumentenart" zu verschieben bzw. zu selektieren (hab es z.b. schon mit findstr. versucht)
Ich danke jetzt schonmal für die Mühe,
lg
chris
folgendes.
in einem Ordner liegen mehrere *.tif Dokumente welche folgende Namensgebung haben:
Kunde YYYY_MM_TT Dokumentenart
sprich
Max Musterman 2009_05_12 Angebot.tif
oder
Max Musterman 2009_05_12 Bestellung.tif
der entsprechende Ordner wird per watchdir überwacht und bei einer Änderung soll dann diese batch gestartet werden.
Was soll diese Batch machen?
die Batch soll die Dateien nach Dokumentenart in die Entsprechenden Ordner verschieben.
ich habe schon verschiedene Lösungsmöglichkeiten getestet, jedoch schaffe ich es einfach nicht die *.tif-Dateien nach "Dokumentenart" zu verschieben bzw. zu selektieren (hab es z.b. schon mit findstr. versucht)
Ich danke jetzt schonmal für die Mühe,
lg
chris
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 115937
Url: https://administrator.de/forum/dateien-auf-grund-des-dateinamens-in-ordner-verschieben-115937.html
Ausgedruckt am: 29.04.2025 um 01:04 Uhr
17 Kommentare
Neuester Kommentar
Hallo kingchris und willkommen im Forum!
Die Dokumentenart solltest Du etwa so in eine Variable bekommen:
Das Verschieben könnte (ungetestet) etwa so gehen:
Grüße
bastla
[Edit] Überzähliges %-Zeichen in Zeile 12 entfernt und in Zeile 13 hinzugefügt
[/Edit]
Die Dokumentenart solltest Du etwa so in eine Variable bekommen:
for %%i in ("D:\Ordner\*.tif") do for %%a in (%%~ni) do set "DA=%%a"
@echo off & setlocal
set "Basis=D:\Ordner"
set "Archiv=D:\Archiv"
for %%i in ("%Basis%\*.tif") do call :ProcessFile "%%i"
goto :eof
:ProcessFile
for %%a in (%~n1) do set "DA=%%a"
set "Ziel=%Archiv%\%DA%"
if not exist "%Ziel%" md "%Ziel%"
if not exist "%Ziel%\%~nx1" move %1 "%Ziel%" & goto :eof
echo Die Zieldatei "%Ziel%\%~nx1" existiert bereits!
goto :eof
bastla
[Edit] Überzähliges %-Zeichen in Zeile 12 entfernt und in Zeile 13 hinzugefügt

Hallo Bastla,
die Dateinamen haben doch Leerzeichen,
dann knallt es in Zeile 09 weil da durch die Tilde keine Quotes mehr sind.
Gruß
LotPings
die Dateinamen haben doch Leerzeichen,
dann knallt es in Zeile 09 weil da durch die Tilde keine Quotes mehr sind.
Gruß
LotPings
@77559
Die Leerzeichen brauche ich ja zum Aufteilen (das ist keine "for /f"-Schleife in Zeile 9) ...
@kingchris
Inzwischen getestet, und bei mir klappt das mit Dateinamen nach Deinem Muster - wie sieht denn die vollständige Ausgabe mit einem "echo on" in Zeile 1 aus?
Für die erste Datei wäre das bei mir (die lange Zeile am Ende habe ich zusammengezogen):
Aus dem CMD-Fenster kopieren geht übrigens sehr einfach, wenn der "Quick-Edit-Modus" (findest Du in den Eigenschaften des CMD-Fensters per Klick auf das "Systemmenü" = linke obere Ecke des Fensters) aktiviert ist - dann kannst Du mit der linken Maustaste Text markieren und mit der rechten kopieren (bzw, wenn nichts markiert ist, einfügen).
Und nein, es soll tatsächlich
heißen (die Anführungszeichen setze ich dann nachher bei der Verwendung der Variablen genau dort, wo ich sie brauche).
Grüße
bastla
Die Leerzeichen brauche ich ja zum Aufteilen (das ist keine "for /f"-Schleife in Zeile 9) ...
@kingchris
Inzwischen getestet, und bei mir klappt das mit Dateinamen nach Deinem Muster - wie sieht denn die vollständige Ausgabe mit einem "echo on" in Zeile 1 aus?
Für die erste Datei wäre das bei mir (die lange Zeile am Ende habe ich zusammengezogen):
D:\>set "Basis=D:\Ordner"
D:\>set "Archiv=D:\Archiv"
D:\>for %i in ("D:\Ordner\*.tif") do call :ProcessFile "%i"
D:\>call :ProcessFile "D:\Ordner\Max Musterman 2009_05_12 Bestellung.tif"
D:\>for %a in (Max Musterman 2009_05_12 Bestellung) do set "DA=%a"
D:\>set "DA=Max"
D:\>set "DA=Musterman"
D:\>set "DA=2009_05_12"
D:\>set "DA=Bestellung"
D:\>set "Ziel=D:\Archiv\Bestellung"
D:\>if not exist "D:\Archiv\Bestellung" md "D:\Archiv\Bestellung"
D:\>if not exist "D:\Archiv\Bestellung\Max Musterman 2009_05_12 Bestellung.tif" move "D:\Ordner\Max Musterman 2009_05_12 Bestellung.tif" "D:\Archiv\Bestellung" & goto :eof
Und nein, es soll tatsächlich
set "Basis=D:\Ordner"
Grüße
bastla
Hallo kingchris!
Freut mich, dass es doch geklappt hat.
Nur als Anmerkung zu den Dateinamen: Wenn die Dokumentenart Leerzeichen, Kommata oder Semikolons enthalten sollte, wird der Batch nicht (ordnungsgemäß) funktionieren (da diese Zeichen als Trennzeichen interpretiert werden und dann nur der Teil nach dem letzten Trennzeichen in %DA% stünde) - auch das Leerzeichen vor der Dokumentenart ist wichtig und daher erforderlich (da dort geteilt wird).
Grüße
bastla
Freut mich, dass es doch geklappt hat.
Nur als Anmerkung zu den Dateinamen: Wenn die Dokumentenart Leerzeichen, Kommata oder Semikolons enthalten sollte, wird der Batch nicht (ordnungsgemäß) funktionieren (da diese Zeichen als Trennzeichen interpretiert werden und dann nur der Teil nach dem letzten Trennzeichen in %DA% stünde) - auch das Leerzeichen vor der Dokumentenart ist wichtig und daher erforderlich (da dort geteilt wird).
Grüße
bastla
Hallo kingchris!
Der Rest ist ein wenig Absicherung und vermutlich nachvollziehbar - aber wenn Du doch noch Fragen hast: gerne.
Grüße
bastla
wenn es dir nicht allzuviel Mühe macht, könntest du mir das mal aufschlüsseln was da genau passiert?
die Var. "DA" wird ja 4x überschrieben und hält dann den letzen Wert oder?
So ist es - die enthaltenen Leerzeichen teilen den Dateinamen auf, und mit der "for"-Schleife kommt jeder Teil einmal an die Reihe in die Variable geschrieben zu werden - der letzte Bestandteil (eben die Dokumentenart) bleibt dann schließlich in der Variablen.die Var. "DA" wird ja 4x überschrieben und hält dann den letzen Wert oder?
Der Rest ist ein wenig Absicherung und vermutlich nachvollziehbar - aber wenn Du doch noch Fragen hast: gerne.
Grüße
bastla

Zitat von @bastla:
@77559
Die Leerzeichen brauche ich ja zum Aufteilen (das ist keine "for /f"-Schleife in Zeile 9) ...
@77559
Die Leerzeichen brauche ich ja zum Aufteilen (das ist keine "for /f"-Schleife in Zeile 9) ...
Moin bastla,
war wohl gestern Abend nicht auf der Höhe,
sonst hätte ich auch gemerkt das das Vorhaben mit einem Einzeiler lösbar wäre
@for %%A in (Angebot Bestellung Auftrag) DO @Move "D:\Ordner\*%%A.tif" "D:\Archiv\%%A\"
Gruß
LotPings

Mein vorgeschlagener Einzeiler lässt sich da einfach anpassen 
Das er bei jedem Aufruf auch versucht nicht vorhandene Dokumentarten zu verschieben schadet ja nicht.
Gruß
LotPings
@for %%A in (Angebot Bestellung Auftrag) DO @Move "D:\Ordner\*%%A*.tif" "D:\Archiv\%%A\"
Das er bei jedem Aufruf auch versucht nicht vorhandene Dokumentarten zu verschieben schadet ja nicht.
Gruß
LotPings

Hallo kingchris.
Die Fehlermeldung ist normal wenn er nichts findet.
Diese ließe sich mit angehängtem
Verschieben sollte er aber korrekt wenn du die Ordner entsprechend deiner Struktur angepasst hast.
Gruß
LotPings
Die Fehlermeldung ist normal wenn er nichts findet.
Diese ließe sich mit angehängtem
>NUL 2>&1
unterdrücken.Verschieben sollte er aber korrekt wenn du die Ordner entsprechend deiner Struktur angepasst hast.
Gruß
LotPings