hausboot
Goto Top

Dateien mittels Batch, Script in verschiedene Ordner verschieben

Hallo in die Runde,

da ich in der Script bzw Batcherstellung Neuling bin, möchte ich mich an die erfahrenen Anwender wenden.
Folgendes Problem:
In einem Ordner habe ich Dateien, die ich per Script, bzw Batchdatei in die dazugehörigen Ordnern in einem anderen Laufwerk verschieben will. Gleichzeitig soll eine Log.Datei erstellt werden, deren Inhalt die Dateinamen anzeigt, die verschoben worden sind.
Beispiel 1:
Quelldatei: d:\\Hausverwaltung\\Köln_2008.07.01_5002723.pdf
Diese Datei soll auf Laufwerk T:\\Haus\\50027xx\\5002723\\01_Mietverträge\\014_Verwaltung\\0141_Verträge verschoben werden.
Beispiel 2:
Quelldatei: d:\\Hausverwaltung\\Düsseldorf_2008.08.15_8003841.pdf
Diese Datei soll auf Laufwerk T:\\Haus\\80038xx\\8003841\\01_Mietverträge\\014_Verwaltung\\0141_Verträge verschoben werden.
Im Voraus vielen Dank.

Content-ID: 94874

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

Ausgedruckt am: 23.11.2024 um 08:11 Uhr

bastla
bastla 20.08.2008, aktualisiert am 18.10.2012 um 18:36:07 Uhr
Goto Top
Hallo Hausboot und willkommen im Forum!

Aus Deinen Beispielen entnehme ich, dass eigentlich nur die jeweilige Objektnummer (zB 5002723) bzw deren erste 5 Stellen als variable Bestandteile zu verwenden sind, während der Rest des Pfades als konstant betrachtet werden kann.

Wenn die Namenskonvention "Ort_Datum_Objektnummer" konsequent eingehalten wurde, könnte das etwa so gehen:
@echo off & setlocal
for /f "tokens=2 delims=:." %%i in ('chcp') do set "cp=%%i"  
chcp 1252>nul

set "Quelle=D:\Hausverwaltung"  
set "Ziel=T:\Haus"  
set "ZielUnter=01_Mietverträge\014_Verwaltung\0141_Verträge verschoben"  
set "Log=D:\Verträge_verschoben.log"  

if exist "%Log%" del "%Log%"  
for %%i in ("%Quelle%\*.pdf") do call :ProcessFile "%%~fi"  
chcp %cp%>nul
goto :eof

:ProcessFile
for /f "tokens=3 delims=_" %%a in ("%~n1") do set "Obj=%%a"  
set "ZielPfad=%Ziel%\%Obj:~,5%xx\%Obj%\%ZielUnter%"  
if not exist "%ZielPfad%\" md "%ZielPfad%" 2>nul || (echo ## "%Zielpfad%" ist nicht vorhanden!>>"%Log%" & goto :eof)  
if exist "%Zielpfad%\%~nx1" echo ## Datei %1 in "%Zielpfad%" bereits vorhanden!>>"%Log%" & goto :eof  
move %1 "%Zielpfad%\" && echo %1 verschoben nach "%Zielpfad%">>"%Log%"  
goto :eof
Wegen der Umlaute in den Ordnernamen musst Du entweder einen Editor, der das ASCII-Format unterstützt, oder (wie etwa hier gezeigt) die Codepage 1252 verwenden.

Grüße
bastla
Hausboot
Hausboot 21.08.2008 um 09:41:00 Uhr
Goto Top
Guten Morgen Bastla,

vielen Dank für die schnelle Antwort.
Der Lösungsansatz entspricht nicht ganz dessen, was ich mir vorgestellt hatte.
Der Zielpfad ist variabel.
Quelldatei: d:\Hausverwaltung\Köln_2008.07.01_5002723.pdf
Diese Datei soll auf Laufwerk T:\Haus\50027xx\5002723\01_Mietverträge\014_Verwaltung\0141_Verträge verschoben werden.<<
Der variable Teil besteht in diesem Beispiel aus ...\50027xx\5002723\.... . Die Ordner davor und hahinter sind immer die Gleichen.

Grüße
Hausboot
bastla
bastla 21.08.2008 um 10:47:45 Uhr
Goto Top
Hallo Hausboot!

Der Zielpfad ist variabel.
Der variable Teil besteht in diesem Beispiel aus ...\50027xx\5002723\.... . Die Ordner davor und hahinter sind immer die Gleichen.
Dass ich das so verstanden habe, hätte eigentlich mein erster Satz ausdrücken sollen ...

... und ist auch entsprechend im Batch umgesetzt.

Da ich davon ausgehe, dass Du diesen noch nicht wirklich getestet hast, noch ein Hinweis:
Um mit Testdaten arbeiten zu können, brauchst Du eigentlich nur in den Zeilen 5 und 6 andere Quell- bzw Zielordner anzugeben (etwa "D:\HVTest" und "T:\HausTest"), und 2 oder 3 Dateien in den Test-Quellordner zu legen.

Grüße
bastla
Hausboot
Hausboot 21.08.2008 um 21:24:12 Uhr
Goto Top
Hallo Bastla,

ich hatte beim Testen keine pdf-Datei ausgewählt. Mein Fehler. Es funktioniert jetzt einwandfrei.
Ich habe jedoch nich eine Bitte.
Könntest Du die Batchdatei so abändern, dass keine Ordner erstellt werden, sondern die Dateien sofort in die entsprechenden Ordner verschoben werden? Die Log-Datei soll erstellt werden.
Nochmals vielen Dank für die schnellen Antworten.

Grüße
Hausboot
bastla
bastla 21.08.2008 um 21:33:03 Uhr
Goto Top
Hallo Hausboot!

Könntest Du die Batchdatei so abändern, dass keine Ordner erstellt werden, sondern die Dateien sofort in die entsprechenden Ordner verschoben werden?
Dieses Mal kann ich Dir tatsächlich nicht folgen: Es werden ja nur jene Ordner erstellt, in welche dann tatsächlich Dateien verschoben werden sollen, und auch das nur, soferne es diese Ordner noch nicht gibt (siehe Zeile 18) ...

Grüße
bastla
Hausboot
Hausboot 21.08.2008 um 22:24:50 Uhr
Goto Top
Hallo Bastla,

mein Problem ist, dass bei diesem Beispiel, der Ordner >>5002723 - Mietobjekt 10 - AK1000<< heißen kann.
Die Bezeichnugnen ändern sich im dritten Unterordner.
T:\Haus\50027xx\5002723 - Mietobjekt 10 - AK1000\01_Mietverträge\014_Verwaltung\0141_Verträge verschoben werden.<<
Da die Namen unterschiedlich sind, dachte ich, dass die zu verschiebende Datei direkt in den vorgesehenen Ordner verschoben werden kann.
Danke für deine Geduld

Grüße
Hausboot
bastla
bastla 21.08.2008 um 22:32:02 Uhr
Goto Top
Hallo Hausboot!

Da die Namen unterschiedlich sind, dachte ich, dass die zu verschiebende Datei direkt in den vorgesehenen Ordner verschoben werden kann.
Wie soll denn festgestellt werden, welches der "vorgesehene" Ordner ist, wenn es keine einheitlichen Namenskonventionen gibt?

Grüße
bastla
Hausboot
Hausboot 21.08.2008 um 22:50:02 Uhr
Goto Top
Hallo Bastla,

da ich keine Ahnung von Batchprogrammierung habe, hatte ich mir gedacht, dass durch Wildcards (falls sowas möglich ist) die Zusätze - Mietobjekt 10 - AK1000 zu ersetzen sind. Die Ziffernfolge 5002723 ergibt sich aus z.B. Köln_2008.07.01_5002723.pdf.
Kann man es eventuell so realisieren?

Grüße

Hausboot
bastla
bastla 21.08.2008 um 22:55:52 Uhr
Goto Top
Hallo Hausboot!

da ich keine Ahnung von Batchprogrammierung habe
Musst Du auch nicht, es genügt eine exakte Beschreibung der nötigen Vorgangsweise ...

Diese könnte jetzt (für das konkrete Beispiel) so lauten:
Finde den ersten Unterordner von "50027xx", dessen Name mit "5002723" beginnt, und verschiebe die Datei in den Unterunterunterordner "01_Mietverträge\014_Verwaltung\0141_Verträge verschoben" des gefundenen Ordners (dieser Teil ist dann ja hoffentlich wirklich konstant).

Kommt das so hin?

Grüße
bastla
Hausboot
Hausboot 21.08.2008 um 23:02:02 Uhr
Goto Top
Hallo Bastla,

deine Beschreibung ist korrekt.
Kann man dies auch auf auf die anderen Dateien z.B. 80038xx\\8003841 umsetzen?

Grüße

Hausboot
bastla
bastla 21.08.2008 um 23:24:18 Uhr
Goto Top
Hallo Hausboot!

Kann man dies auch auf auf die anderen Dateien z.B. 80038xx\\8003841 umsetzen?
Wenn schon, denn schon ... face-wink
@echo off & setlocal
for /f "tokens=2 delims=:." %%i in ('chcp') do set "cp=%%i"  
chcp 1252>nul

set "Quelle=D:\Hausverwaltung"  
set "Ziel=T:\Haus"  
set "ZielUnter=01_Mietverträge\014_Verwaltung\0141_Verträge verschoben"  
set "Log=D:\Verträge_verschoben.log"  

if exist "%Log%" del "%Log%"  
for %%i in ("%Quelle%\*.pdf") do call :ProcessFile "%%~fi"  
chcp %cp%>nul
goto :eof

:ProcessFile
for /f "tokens=3 delims=_" %%a in ("%~n1") do set "Obj=%%a"  
set Ziel2=
for /d %%v in ("%Ziel%\%Obj:~,5%xx\%Obj%*.*") do set "Ziel2=%%~fv"  
if not defined Ziel2 echo ## Ein Ordner für "%Obj%" konnte nicht gefunden werden!>>"%Log%" & goto :eof  
set "ZielPfad=%Ziel2%\%ZielUnter%"  
if not exist "%Zielpfad%\" echo ## Der Pfad "%Zielpfad%" existiert nicht!>>"%Log%" & goto :eof  
if exist "%Zielpfad%\%~nx1" echo ## Datei %1 in "%Zielpfad%" bereits vorhanden!>>"%Log%" & goto :eof  
move %1 "%Zielpfad%\" && echo %1 verschoben nach "%Zielpfad%">>"%Log%"  
goto :eof
Eine kleine Änderung zur obigen Beschreibung: Wenn es mehrere Unterordner, deren Name mit der Objektnummer ("5002723") beginnt, geben sollte, wird nicht unbedingt der (alphabetisch) Erste verwendet. Ist überhaupt davon auszugehen, dass es mehrere solcher Ordner gibt?

Der weitere Pfad ("01_Mietverträge\014_Verwaltung\0141_Verträge verschoben" ) wird jetzt auch nicht erstellt, sondern vorausgesetzt (aber natürlich vorweg geprüft).

Grüße
bastla
Hausboot
Hausboot 21.08.2008 um 23:37:56 Uhr
Goto Top
Hallo Bastla,

ich möchte mich recht herzlich bei Dir bedanken. Es funktioniert jetzt wunderbar.

Ich wünsche Dir eine gute Nacht.

Viele Grüße

Hausboot