Datenbereitstellung per Batch lösen
Hallo,
das nachstehend beschriebene Szenario möchte ich mit einem Batchprogramm lösen. Ich habe mir schon einiges zusammengebastelt, komme aber jetzt nicht weiter. Daher hoffe ich auf Eure Unterstützung.
Ausgangslage:
Auf einem Windowsserver 2008 läuft ein Programm, welches unterschiedliche csv-Dateien aus einem Einleseverzeichnis (Input) einliest und diese in eine Datenbank schreibt. Die Bereitstellung dieser Dateien in das Input-Verzeichnis aus unterschiedlichen Bereitstellungsverzeichnissen (Netzlaufwerke) läuft derzeit manuell. Die Daten aktualisieren sich täglich bzw. monatlich auf den Netzlaufwerken. Jede Datei hat eine eindeutige Bezeichnung, ergänzt um den Stichtag der Gültigkeit (z.B. 20120824_aaa_bbb_ccc.csv oder 20120824_aaa_bbb_ddd.csv)
Ziel:
Die Dateien werden auf Netzlaufwerken (Bereitstellung A,B,C etc.) bereitgestellt und sollen anschließend automatisch in das Input-Verzeichnis verschoben werden, damit das Programm immer die aktuellsten Daten in die Datenbank schreibt. Daher ist darauf zu achten, dass wenn es im Input-Verzeichnis bereits eine entsprechende Datei gibt (z.V. vom Vortag oder Vormonat),dass diese vorher archiviert werden (inklusive Timestamp im Dateinamen) muss.
Folgendes Beispiel soll den Sachverhalt verdeutlichen:
Bereitstellungsverzeichnis B auf Netzlaufwerk:
20120824_aaa_bbb_ccc.csv
20120824_aaa_bbb_ddd.csv
20120824_aaa_bbb_eee.csv
20120824_fff_ggg_hhh.csv
20120824_fff_ggg_iii.csv
20120824_fff_ggg_jjj.csv
Inputverzeichnis I auf Windows Server:
20120823_aaa_bbb_ccc.csv
20120823_aaa_bbb_ddd.csv
20120823_aaa_bbb_eee.csv
20120823_fff_ggg_hhh.csv
20120823_fff_ggg_iii.csv
20120823_fff_ggg_jjj.csv
Das Batchprogramm soll jetzt für jede Datei die im Verzeichnis B liegt prüfen, ob es diese Datei bereits im Inputverzeichnis I gibt. Unabhängig vom vorangestellten Datum, da sich dieses immer ändert.
Z.B. Wenn aaa_bbb_ccc.csv in I enthalten, dann verschiebe aaa_bbb_ccc.csv aus I in das Archivverzeichnis. Der Dateiname der Datei soll dann wie folgt aussehen. In diesem Beispiel würde aus 20120823_aaa_bbb_ccc.csv --->>> 20120823_aaa_bbb_ccc_20120824_1200.csv
Mit mehr oder weniger schönem Code habe ich es soweit hinbekommen, dass die Datei auch in das Archiv verschoben wird, wenn es eine gleichnamige Datei (vom Datum abgesehen) bereits im Inputverzeichnis gibt. Ich schaffe es jedoch nicht, dieser Datei den Timestamp anzuhängen. Könne Ihr mir bitte weiterhelfen? Das Thema Netzlaufwerke habe ich noch garnicht angefangen, bisher läuft alles lokal.
Zu meinem Hintergrund. Ich habe keinerlei Erfahrung in Batchprogrammierung und nur historisches html, php und sql Wissen.
Der Code sieht wie folgt aus:
Dateinamen_Auslesen.bat
Testunterprogramm
Viele Grüße
thenewone
das nachstehend beschriebene Szenario möchte ich mit einem Batchprogramm lösen. Ich habe mir schon einiges zusammengebastelt, komme aber jetzt nicht weiter. Daher hoffe ich auf Eure Unterstützung.
Ausgangslage:
Auf einem Windowsserver 2008 läuft ein Programm, welches unterschiedliche csv-Dateien aus einem Einleseverzeichnis (Input) einliest und diese in eine Datenbank schreibt. Die Bereitstellung dieser Dateien in das Input-Verzeichnis aus unterschiedlichen Bereitstellungsverzeichnissen (Netzlaufwerke) läuft derzeit manuell. Die Daten aktualisieren sich täglich bzw. monatlich auf den Netzlaufwerken. Jede Datei hat eine eindeutige Bezeichnung, ergänzt um den Stichtag der Gültigkeit (z.B. 20120824_aaa_bbb_ccc.csv oder 20120824_aaa_bbb_ddd.csv)
Ziel:
Die Dateien werden auf Netzlaufwerken (Bereitstellung A,B,C etc.) bereitgestellt und sollen anschließend automatisch in das Input-Verzeichnis verschoben werden, damit das Programm immer die aktuellsten Daten in die Datenbank schreibt. Daher ist darauf zu achten, dass wenn es im Input-Verzeichnis bereits eine entsprechende Datei gibt (z.V. vom Vortag oder Vormonat),dass diese vorher archiviert werden (inklusive Timestamp im Dateinamen) muss.
Folgendes Beispiel soll den Sachverhalt verdeutlichen:
Bereitstellungsverzeichnis B auf Netzlaufwerk:
20120824_aaa_bbb_ccc.csv
20120824_aaa_bbb_ddd.csv
20120824_aaa_bbb_eee.csv
20120824_fff_ggg_hhh.csv
20120824_fff_ggg_iii.csv
20120824_fff_ggg_jjj.csv
Inputverzeichnis I auf Windows Server:
20120823_aaa_bbb_ccc.csv
20120823_aaa_bbb_ddd.csv
20120823_aaa_bbb_eee.csv
20120823_fff_ggg_hhh.csv
20120823_fff_ggg_iii.csv
20120823_fff_ggg_jjj.csv
Das Batchprogramm soll jetzt für jede Datei die im Verzeichnis B liegt prüfen, ob es diese Datei bereits im Inputverzeichnis I gibt. Unabhängig vom vorangestellten Datum, da sich dieses immer ändert.
Z.B. Wenn aaa_bbb_ccc.csv in I enthalten, dann verschiebe aaa_bbb_ccc.csv aus I in das Archivverzeichnis. Der Dateiname der Datei soll dann wie folgt aussehen. In diesem Beispiel würde aus 20120823_aaa_bbb_ccc.csv --->>> 20120823_aaa_bbb_ccc_20120824_1200.csv
Mit mehr oder weniger schönem Code habe ich es soweit hinbekommen, dass die Datei auch in das Archiv verschoben wird, wenn es eine gleichnamige Datei (vom Datum abgesehen) bereits im Inputverzeichnis gibt. Ich schaffe es jedoch nicht, dieser Datei den Timestamp anzuhängen. Könne Ihr mir bitte weiterhelfen? Das Thema Netzlaufwerke habe ich noch garnicht angefangen, bisher läuft alles lokal.
Zu meinem Hintergrund. Ich habe keinerlei Erfahrung in Batchprogrammierung und nur historisches html, php und sql Wissen.
Der Code sieht wie folgt aus:
Dateinamen_Auslesen.bat
set "Verzeichnis=TestDateien\Bereitstellung"
for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set TIMESTAMP=%%k%%j%%i
for /f "tokens=1,2,3,4 delims=:," %%i in ('time /t') do set TIMESTAMP=%TIMESTAMP%%%i%%j
rem --> 2a) Dateien aus Bereitstellungsverzeichnissen kopieren und alte Dateien archivieren
rem --> 2a1) ---> Dateien aus dem XXXX-Verzeichnis
for /f "tokens=* delims== " %%f in ('dir /b /a-d %Verzeichnis%\*.csv') do set nameLang=%%~nxf & set nameKurz=%%~nf & call Testunterprogramm %name% >>Protokoll\LCT_Datenbeladung_%TIMESTAMP%.log
Testunterprogramm
set "DateinameZiel=%nameKurz:~,-1%"
set "DateinameZiel=%DateinameZiel%_%TIMESTAMP%.csv"
set "DateinameVergleich=%nameLang:~9%"
set "DateinameVergleich2=%DateinameVergleich:~,-5%"
set "DateinameVergleich2=%DateinameVergleich2%_%TIMESTAMP%.csv"
echo %DateinameVergleich2%
rem Bereich Verschieben
if exist TestDateien\*%DateinameVergleich% (move TestDateien\*%DateinameVergleich% TestDateien\Archiv\*%DateinameVergleich2%)
copy /y TestDateien\Bereitstellung\*%DateinameVergleich% TestDateien\%nameLang%
Viele Grüße
thenewone
Please also mark the comments that contributed to the solution of the article
Content-Key: 190124
Url: https://administrator.de/contentid/190124
Printed on: April 24, 2024 at 22:04 o'clock
8 Comments
Latest comment
moin thenewone,
hach ich mag immer solch unaussagekräftigen Batches nicht so:
Gruß Phil
hach ich mag immer solch unaussagekräftigen Batches nicht so:
@echo off
setlocal
set "Quelle=\\Computername\Freigabename\Ordner"
set "Ziel=D:\Eingangsverzeichnis"
set "Archiv=D:\Archiv"
for /f "tokens=1-3Delims=. " %%a in ('date /t') do for /f "tokens=1,2delims=:" %%d in ('time/t') do set "LOG=D:\Protokoll\LCT_Datenbeladung_%%c%%b%%a%%d%%e.log"
pushD "%Quelle%"
>>"%Log%" (
for %%i in (*.csv) do (
for /f "tokens=1*delims=_" %%j in ("%%~ni") do (
for %%j in ("%Ziel%*%%~k%%~xi") do for /f "tokens=1-3Delims=. " %%a in ('date /t') do for /f "tokens=1,2delims=:" %%d in ('time/t') do move "%%~i" "%Archiv%\%%~nj_%%c%%b%%a_%%d%%e%%~xj"
echo "%%~nxi"
copy "%%~i" "%Ziel%"
)
)
popD
Gruß Phil
Also die erste ForSchleife listet alle CSV des Verzeichnisses auf.
Die zweite schneidet von der CSV alles einschließlich des ersten Unterstriches ab.
Die dritte listet
(ach hier isn Fehler -> %%dpi is Falsch und muss ausserdem %Ziel%\ sein, sonst wird das von Netzwerk ins Archiv verschoben dürfte ohne Schreibrechte nicht klappen)
... die gleichen Namen vom Ziel auf. Und der Timestamp wird für jedes File im Namen eingetragen beim Verschieben.
Aus der ersten Schleife wird dann auch die Datei von Netzwerk ins Zeil kopiert.
Gruß Phil
Die zweite schneidet von der CSV alles einschließlich des ersten Unterstriches ab.
Die dritte listet
(ach hier isn Fehler -> %%dpi is Falsch und muss ausserdem %Ziel%\ sein, sonst wird das von Netzwerk ins Archiv verschoben dürfte ohne Schreibrechte nicht klappen)
... die gleichen Namen vom Ziel auf. Und der Timestamp wird für jedes File im Namen eingetragen beim Verschieben.
Aus der ersten Schleife wird dann auch die Datei von Netzwerk ins Zeil kopiert.
Gruß Phil
moin,
in den Log wurde ja auch umgeleitet mit >>%Log%.
Fehlt vllt noch eine Klammer zu
für den Datumstempel am Ende erstze
mit
Ach ne - völlig am falschen Ende geschraubt.
Gruß Phil
in den Log wurde ja auch umgeleitet mit >>%Log%.
Fehlt vllt noch eine Klammer zu
für den Datumstempel am Ende erstze
echo "%%~nxi"
copy "%%~i" "%Ziel%"
set "Datei=%%~ni"
setlocal enabledelayedexpansion
echo !Datei:~0,-8!
copy "%%~dpi!Datei:~0,-8!" "%Ziel%"
endlocal
Ach ne - völlig am falschen Ende geschraubt.
>>"%Log%" (
for %%i in (*.csv) do (
set "Datei=%%~ni"
setlocal enabledelayedexpansion
for %%j in ("%Ziel%\!Datei:~0,-8!*%%~xi") do (if !os! equ %os% endlocal
for /f "tokens=1-3Delims=. " %%a in ('date /t') do for /f "tokens=1,2delims=:" %%d in ('time/t') do move "%%~i" "%Archiv%\%%~nj_%%c%%b%%a_%%d%%e%%~xj"
)
if !os! equ %os% endlocal
echo "%%~nxi"
copy "%%~i" "%Ziel%"
)
)
Gruß Phil