Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Datenbereitstellung per Batch lösen

Frage Entwicklung Batch & Shell

Mitglied: Thenewone

Thenewone (Level 1) - Jetzt verbinden

24.08.2012 um 12:11 Uhr, 2308 Aufrufe, 8 Kommentare

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
01.
set "Verzeichnis=TestDateien\Bereitstellung" 
02.
 
03.
for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set TIMESTAMP=%%k%%j%%i 
04.
for /f "tokens=1,2,3,4 delims=:," %%i in ('time /t') do set TIMESTAMP=%TIMESTAMP%%%i%%j 
05.
 
06.
rem --> 2a)  Dateien aus Bereitstellungsverzeichnissen kopieren und alte Dateien archivieren 
07.
rem --> 2a1) ---> Dateien aus dem XXXX-Verzeichnis 
08.
 
09.
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
01.
set "DateinameZiel=%nameKurz:~,-1%" 
02.
set "DateinameZiel=%DateinameZiel%_%TIMESTAMP%.csv" 
03.
set "DateinameVergleich=%nameLang:~9%" 
04.
 
05.
set "DateinameVergleich2=%DateinameVergleich:~,-5%" 
06.
set "DateinameVergleich2=%DateinameVergleich2%_%TIMESTAMP%.csv" 
07.
 
08.
echo %DateinameVergleich2% 
09.
 
10.
rem Bereich Verschieben 
11.
if exist TestDateien\*%DateinameVergleich% (move TestDateien\*%DateinameVergleich% TestDateien\Archiv\*%DateinameVergleich2%) 
12.
copy /y TestDateien\Bereitstellung\*%DateinameVergleich% TestDateien\%nameLang%
Viele Grüße
thenewone
Mitglied: pieh-ejdsch
24.08.2012, aktualisiert 28.08.2012
moin thenewone,

hach ich mag immer solch unaussagekräftigen Batches nicht so:
01.
@echo off 
02.
setlocal 
03.
 
04.
set "Quelle=\\Computername\Freigabename\Ordner" 
05.
set "Ziel=D:\Eingangsverzeichnis" 
06.
set "Archiv=D:\Archiv" 
07.
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" 
08.
 
09.
pushD "%Quelle%" 
10.
 
11.
>>"%Log%" ( 
12.
for %%i in (*.csv) do ( 
13.
  for /f "tokens=1*delims=_" %%j in ("%%~ni") do ( 
14.
    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" 
15.
  echo "%%~nxi" 
16.
  copy "%%~i" "%Ziel%" 
17.
18.
19.
popD 
Gruß Phil
Bitte warten ..
Mitglied: Thenewone
24.08.2012 um 14:14 Uhr
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:
01.
> for %%i in (*.csv) do ( 
02.
>   for /f "tokens=1*delims=_" %%j in ("%%~ni") do ( 
03.
>     for %%j in ("%%dpi*%%~k%%~xi") do for /f "tokens=1-3Delims=. " %%a in ('date /t') do for /f 
04.
> "tokens=1,2delims=:" %%d in ('time/t') do move "%%~i" 
05.
> "%Archiv%\%%~nj_%%c%%b%%a_%%d%%e%%~xj" 
06.
>   echo "%%~nxi" 
07.
>   copy "%%~i" "%Ziel%" 
08.
> ) 
09.
> ) 
10.
> popD  
11.
> 
Gruß Phil
Bitte warten ..
Mitglied: pieh-ejdsch
24.08.2012 um 18:04 Uhr
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
Bitte warten ..
Mitglied: Thenewone
27.08.2012 um 08:26 Uhr
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... Das verstehe ich noch nicht ganz.

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

Gruß
Bitte warten ..
Mitglied: Thenewone
27.08.2012 um 08:54 Uhr
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
01.
for %%i in (*.csv) do (echo "%%~nxi")
und alles danach bis auf die letzte Klammer und popD ist auskommentiert.


01.
@echo off 
02.
setlocal 
03.
 
04.
set "Quelle=D:\Batch\Quelle" 
05.
set "Ziel=D:\Batch\Ziel" 
06.
set "Archiv=D:\Batch\Archive" 
07.
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" 
08.
 
09.
pushD "%Quelle%" 
10.
 
11.
"%Log%" ( 
12.
for %%i in (*.csv) do ( 
13.
 
14.
for /f "tokens=1*delims=_" %%j in ("%%~ni") do ( 
15.
  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" 
16.
  echo "%%~nxi" 
17.
  copy "%%~i" "%Ziel%" 
18.
19.
20.
 popD  
21.
 
Bitte warten ..
Mitglied: Thenewone
27.08.2012 um 15:40 Uhr
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
Bitte warten ..
Mitglied: pieh-ejdsch
28.08.2012, aktualisiert um 17:35 Uhr
moin,

in den Log wurde ja auch umgeleitet mit >>%Log%.
Fehlt vllt noch eine Klammer zu

für den Datumstempel am Ende erstze
01.
  echo "%%~nxi"  
02.
  copy "%%~i" "%Ziel%" 
mit
01.
  set "Datei=%%~ni" 
02.
  setlocal enabledelayedexpansion 
03.
  echo !Datei:~0,-8! 
04.
  copy "%%~dpi!Datei:~0,-8!" "%Ziel%" 
05.
  endlocal
Ach ne - völlig am falschen Ende geschraubt.
01.
>>"%Log%" ( 
02.
for %%i in (*.csv) do ( 
03.
  set "Datei=%%~ni" 
04.
  setlocal enabledelayedexpansion 
05.
  for %%j in ("%Ziel%\!Datei:~0,-8!*%%~xi") do (if !os! equ %os% endlocal 
06.
    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" 
07.
08.
  if !os! equ %os% endlocal 
09.
  echo "%%~nxi" 
10.
  copy "%%~i" "%Ziel%" 
11.
12.
)
Gruß Phil
Bitte warten ..
Mitglied: Thenewone
29.08.2012 um 13:24 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Batch & Shell
Batch zum bearbeiten mehrerer CSV (2)

Frage von Matzus87 zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...