kingchris
Goto Top

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

Content-Key: 115937

Url: https://administrator.de/contentid/115937

Printed on: April 24, 2024 at 20:04 o'clock

Member: bastla
bastla May 12, 2009 at 20:25:56 (UTC)
Goto Top
Hallo kingchris und willkommen im Forum!

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"
Das Verschieben könnte (ungetestet) etwa so gehen:
@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
Grüße
bastla

[Edit] Überzähliges %-Zeichen in Zeile 12 entfernt und in Zeile 13 hinzugefügt face-wink [/Edit]
Member: kingchris
kingchris May 12, 2009 at 20:36:25 (UTC)
Goto Top
wow schnelle antwort und jetzt schnell mal testen....

hmm scheint noch irgendwas nicht zu gehen,
syntaxfehler. allerdings keine weiteren meldungen

--edit--
ach da gings noch weiter ...
ok nochmals von vorne
--edit2--
keine ändeung. dateien bleiben unangetastet und keine ausgabe in der cmd

müsste es nicht eig. set Basis="D:\Ordner" heisen?
Member: bastla
bastla May 12, 2009 at 20:41:32 (UTC)
Goto Top
Hallo kingchris!

Sorry - war etwas zu flott und hatte noch ein %-Zeichen zu viel (bzw in der falschen Zeile face-confused) ...

Grüße
bastla
Member: kingchris
kingchris May 12, 2009 at 20:51:14 (UTC)
Goto Top
hallo bastla hier mal die CMD ausgabe (bei echo on)

ausgabe der CMD
for %i in ("D:\Ordner/*.tif") do call  
call
call
call
goto :eof

ich habe es mal mit 3 Dateien getestet daher meiner meinung nach die 3 "Calls"
Mitglied: 77559
77559 May 12, 2009 at 21:02:11 (UTC)
Goto Top
Hallo Bastla,

die Dateinamen haben doch Leerzeichen,
dann knallt es in Zeile 09 weil da durch die Tilde keine Quotes mehr sind.

Gruß
LotPings
Member: bastla
bastla May 12, 2009 at 21:06:32 (UTC)
Goto Top
@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):
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
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
set "Basis=D:\Ordner"
heißen (die Anführungszeichen setze ich dann nachher bei der Verwendung der Variablen genau dort, wo ich sie brauche).

Grüße
bastla
Member: kingchris
kingchris May 12, 2009 at 21:18:16 (UTC)
Goto Top
Hallo bastla,

habe gerade noch ein drittes mal den code durch gelesen und keinen unterschied gefunden.

copy und paste bring allerdings den gewünschten erfolg. ist wohl zu spät heute für mich face-smile

funktioniert auf jeden fall einwandfrei.

ich danke für die schnelle und kompetente hilfe!
Member: bastla
bastla May 12, 2009 at 21:23:07 (UTC)
Goto Top
Hallo kingchris!

Freut mich, dass es doch geklappt hat. face-smile

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
Member: kingchris
kingchris May 12, 2009 at 21:28:19 (UTC)
Goto Top
hallo bastla
danke für den tipp, das wird allerdings nicht vorkommen, da als Dokumenten arten auser Angebot, Bestellung und Auftrag nichts in Frage kommt face-smile

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?


--edit--
hab meine fehler gefunden.
:ProcessFile "%%i"   
und
& goto :eof 
sind in ne seperate zeile "gerutscht...
komisch was so n zeilenumbruch alles bewirken kann ;)
Member: bastla
bastla May 12, 2009 at 21:38:05 (UTC)
Goto Top
Hallo kingchris!
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.

Der Rest ist ein wenig Absicherung und vermutlich nachvollziehbar - aber wenn Du doch noch Fragen hast: gerne.

Grüße
bastla
Member: kingchris
kingchris May 12, 2009 at 21:42:24 (UTC)
Goto Top
Hallo bastla,

ja jetzt lichtet sich so langsam der Batch-Dschungel.
und meine restlichen Fragen ala "Was bewirkt ProcessFile" hat mir dann google noch erklärt.
eigentlich ist es ganz selbst erklärend wenn man weis was man machen muss face-smile

danke nochmals für die schnelle hilfe!
Mitglied: 77559
77559 May 13, 2009 at 07:08:15 (UTC)
Goto Top
Zitat von @bastla:
@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 face-wink

@for %%A in (Angebot Bestellung Auftrag) DO @Move "D:\Ordner\*%%A.tif"  "D:\Archiv\%%A\"  

Gruß
LotPings
Member: kingchris
kingchris May 13, 2009 at 07:28:57 (UTC)
Goto Top
Hallo Leute,

ich jetzt doch nochmal

habe gerade festegelstellt das ich scheinbar doch einige "Dokumente" habe, welche nicht ganz in dieses System passen z.b. habe ich hier dokumente gefunden die folgende Dateinamen haben

Max_Mustermann 2009_05_13 Bestellung_2
(liegt daran das am selben Tag 2 Bestellungen erfolgt sind.)
die obige lösung verschiebt mir dann allerdings diese Datei in den Ordner "Bestellung_2" sollte allerdings in "Bestellung.

nun hab ich überlegt, ob ich die letzten beiden Zeichen nicht einfach "abschneiden" lasse,. (bah ich aus einem anderen Beitrag von LotPings)

%DA:~0,-2% 
sollte den gewünschten erfolg bringen, nur schneidet er mir ja dann immer alles ab. wie könnte ich das lösen?
es sollen nachher nur die Ordner "Bestellung" "Auftrag" "Angebot" vorhanden sein.

danke schonmal im voraus
Mitglied: 77559
77559 May 13, 2009 at 07:43:50 (UTC)
Goto Top
Mein vorgeschlagener Einzeiler lässt sich da einfach anpassen face-wink

@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
Member: kingchris
kingchris May 13, 2009 at 07:51:05 (UTC)
Goto Top
Hallo LotPings,

copy und paste bring folgendes ergebinss in der CMD

Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung
ist falsch.
Mehrere Dateien können nicht in eine einzelne Datei verschoben werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.


mehr an Ausgabe bringt er in der CMD nicht
Mitglied: 77559
77559 May 13, 2009 at 08:06:53 (UTC)
Goto Top
Hallo kingchris.

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
Member: kingchris
kingchris May 13, 2009 at 08:30:26 (UTC)
Goto Top
Hallo LotPings,

ich sollte die Ordner vielleicht auch erstellen, wenn ich da was rein verschieben will face-smile

ok. nun klappt es so wie es soll.

danke für die schnelle Hilfe