Top-Themen

Aktuelle Themen (A bis Z)

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, 2331 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 ..
Ähnliche Inhalte
Webbrowser
Was ist mit Firefox los?
gelöst Frage von honeybeeWebbrowser2 Kommentare

Hallo, jedes Mal, wenn ich Firefox starte, meckert der Kaspersky ständig mit dieser u. g. Meldung Ich hatte keine ...

Windows Server
Client lässt sich von der Domäne nicht lösen
Frage von Wid0kejWindows Server8 Kommentare

Hallo Ich kämpfe seit Tagen mit einem schwer beschädigten Server ( ) und habe jetzt entschieden, die Client Rechner ...

Netzwerke
Subnetz CIDR lösen
Frage von BaumKoNetzwerke7 Kommentare

hallo, ich habe hier 2 Aufgaben versucht zu lösen. Die erste ist laut Lösung korrekt. Nun habe ich das ...

Administrator.de Feedback
Verbindung zu anderem user wieder lösen mit smartphone
Frage von LochkartenstanzerAdministrator.de Feedback1 Kommentar

Moin, Hallo Frank, Ich habe nur ein "kleines" smartphone (4") und habe heute festgestellt, daß es schwirig ist, eine ...

Neue Wissensbeiträge
Verschlüsselung & Zertifikate

Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows

Information von ticuta1 vor 25 MinutenVerschlüsselung & Zertifikate

Interessant SSH-Kommando in CMD.exe und PowerShell

Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 1 TagApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 1 TagWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 1 TagWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Heiß diskutierte Inhalte
Windows Server
RODC kann nicht aus Domäne entfernt werden
Frage von NilsvLehnWindows Server18 Kommentare

HAllo, ich arbeite in einem Universitätsnetzwerk mit 3 Standorten. Die Standorte haben alle ein ESXi Cluster und auf diesen ...

Hardware
Kein Bild mit nur einer bestimmten Grafikkarten - Mainboard Konfiguration
gelöst Frage von bestelittHardware18 Kommentare

Hallo zusammen, ich hatte schon einmal eine ähnliche Frage gestellt. Damals hatte ich genau das gleiche Problem. Allerdings lies ...

Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement17 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...