thenewone
Goto Top

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
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

Content-Key: 190124

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

Printed on: April 19, 2024 at 17:04 o'clock

Member: pieh-ejdsch
pieh-ejdsch Aug 24, 2012, updated at Aug 28, 2012 at 15:10:29 (UTC)
Goto Top
moin thenewone,

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
Member: Thenewone
Thenewone Aug 24, 2012 at 12:14:41 (UTC)
Goto Top
Hallo Phil,

vielen Dank für Deine schnelle Antwort und Hilfe. Was meinst Du mit unaussagekräftigen Batch? Die Prozedur die ich haben möchte?

Damit ich es auch ein wenig verstehe was Deine for-schleifen Sammlung da alles macht, kannst Du mir das vielleicht auch kurz erläutern? Denn ich nehme mal an, dass sich das ja stark auf die im Beispiel angegebenen Namen (20120823_aaa_bbb_ccc.csv) bezieht und nicht alle Dateien komplett identisch von der Anzahl der Zeichen etc. her sind. Wenn ich das aber verstanden habe denke ich kriege ich es auch hin das für die anderen Dateien anzupassen.

Vielen Dank.


Zitat von @pieh-ejdsch:
moin thenewone,

hach ich mag immer solch unaussagekräftigen Batches nicht so:
> for %%i in (*.csv) do (
>   for /f "tokens=1*delims=_" %%j in ("%%~ni") do (  
>     for %%j in ("%%dpi*%%~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
Member: pieh-ejdsch
pieh-ejdsch Aug 24, 2012 at 16:04:35 (UTC)
Goto Top
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
Member: Thenewone
Thenewone Aug 27, 2012 at 06:26:52 (UTC)
Goto Top
Zitat von @pieh-ejdsch:
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

Hi Phil,

was bedeutet "Die zweite schneidet von der csv alles einschließlich des ersten Unterstrichs ab"? Wenn ich alles abschneide bleibt doch nichts mehr übrig... face-smile Das verstehe ich noch nicht ganz.

Bedeutet es, dass ich %%dpi durch %Ziel% ersetzen muss?

Gruß
Member: Thenewone
Thenewone Aug 27, 2012 at 06:54:54 (UTC)
Goto Top
Hi Phil,

leider funktioniert das Programm nicht. Es passiert garnichts. Ich habe lediglich die Verzeichnisse angepasst und aus %%dpi %Ziel%\ gemacht. Aber auch wenn ich das alles auskommentiere und nur eine Ausgabe in die erste for Schleife packe passiert nichts. Im Verzeichnis Quelle ist eine Datei enthalten. Eigentlich müsste er doch für diese eine Datei dann eine Ausgabe in das Log-File schreiben oder?

Es steht dann drin
for %%i in (*.csv) do (echo "%%~nxi")  
und alles danach bis auf die letzte Klammer und popD ist auskommentiert.


@echo off
setlocal

set "Quelle=D:\Batch\Quelle"  
set "Ziel=D:\Batch\Ziel"  
set "Archiv=D:\Batch\Archive"  
for /f "tokens=1-3Delims=. " %%a in ('date /t') do for /f "tokens=1,2delims=:" %%d in ('time/t') do set "LOG=D:\Batch\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 
Member: Thenewone
Thenewone Aug 27, 2012 at 13:40:25 (UTC)
Goto Top
Hi,

habe den Fehler gefunden. Aufgrund der Zeile 11 %Log% hat das Programm nicht korrekt gearbeitet. Jetzt läuft es.

Bisher steht das Datum ja am Anfang des Dateinamens. Wie müsste mann denn die For-Schleife anpassen, wenn das Datum am Ende des Dateinamens steht?

Hat da jemand einen Hinweis?

Gruß,
thenewone
Member: pieh-ejdsch
pieh-ejdsch Aug 28, 2012 updated at 15:35:19 (UTC)
Goto Top
moin,

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%"   
mit
  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
Member: Thenewone
Thenewone Aug 29, 2012 at 11:24:10 (UTC)
Goto Top
Hi Phil,

super...funktioniert.

Gibt es bei der Batchprogrammierung eigentlich die Möglichkeit Funktionen aufzurufen? Ich möchte eigentlich ungern für jedes Verzeichnis das ausgelesen werden soll den Programmcode kopieren. Dann steht da 10 mal der gleiche Code, nur vorher werden Variablen umgeschrieben.