tristement
Goto Top

Bat Datei zum Täglichen Download mit Aktuellem Datum im Datei Namen

Hallo zusammen,

ich knobel seit einigen Tagen an einer Bat Datei dir mir mein Tägliches Arbeitsleben ein wenig erleichtert.

Ich muss jeden Tag vom FTP server einer Datei herunterladen und möchte dieses halt via Batschscript und Taskplaner automatisieren.

Momentan hänge ich aber leider fest und hoffe das mir hier jemand etwas helfen kann.

Problem an der geschichte ist das die Datei die ich downloaden muss immer das Datum beinhaltet vom vortag und ich nicht weiß wie ich deis realieseren kann.

Hier mal meine bisherigen versuche:

1. Meine Bat Datei:

@echo off
ftp -s:DatenHolen.ftp
Exit

2. die ftp Datei:

open ftp..de
USERNAME
PASSWORD
cd UNTERORTNERVERZEICHNISS

GET RLP_CAUSER_0128_20130715.csv

LCD Z:\Neuer Ordner\test\test3\Download

disconnect

bye


Die Datei RLP_CAUSER_0128_20130715.csv ändert sich täglich im Datum der Rest bleibt immer gleich. gibt es hier die möglichkeit zu sagen das er das aktuelle Datum Downloaden soll Minus einen Tag?

Wäre Nice wenn jemand da mal drüber schauen könnte und evt ne Lösung weiß.

Platform ist Windows 7

mfg

Content-ID: 211533

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

Endoro
Endoro 15.07.2013 um 21:39:32 Uhr
Goto Top
Hallo Tristement,

cmd hat vom M$ leider keine Zeitfunktionen spendiert bekommen.
Müsstest du also zu Fuss nachbauen, wenn es nicht schon mal jemand erledigt hätte face-smile
YESTERDAY.BAT

lg
76109
76109 15.07.2013 aktualisiert um 23:47:29 Uhr
Goto Top
Hallo!

Hab als Nicht-Batcher auch mal was zusammengebastelt, bleib aber lieber bei VBSface-smile

Scheint anhand weniger Tests auch zu funktionieren, allerdings bin ich nicht sicher, ob syntaktisches alles richtig ist. Wer also Lust hat, der kann gerne daran rum/weiterbastelnface-wink
@echo off & setlocal enabledelayedexpansion

::Wert(+/-) für Tage, Wochen, Monate und Jahre, mit dem ein Datum ermittelt werden soll
set /a Value=-1

:: Aktuelles Datum
set "DateStart=%Date%"  
::Aktuelles Datum in Jahre, Monate und Tage splitten
for /f %%i in ('WMIC PATH Win32_LocalTime GET Year^,Month^,Day /Value^|findstr .') do set /a %%i 2>nul||@echo Falsches Datumsformat! & goto:eof  
@echo Datum: !DateStart! (T=!Day! M=!Month! J=!Year!)
@echo.

call :SetDateOfDays
@echo !Value! Tage  : !DateResult!
call :SetDateOfWeeks
@echo !Value! Wochen: !DateResult!
call :SetDateOfMonths
@echo !Value! Monate: !DateResult!
call :SetDateOfYears
@echo !Value! Jahre : !DateResult!
goto :eof

::Berechnung mit Anzahl Tage
: SetDateOfDays
    call :SetDate !Year! !Month! !Day! !Value!
goto :eof

::Berechnung mit Anzahl Wochen
: SetDateOfWeeks
    set /a Number=Value*7
    call :SetDate !Year! !Month! !Day! !Number!
goto :eof

::Berechnung mit Anzahl Monate
: SetDateOfMonths
    set /a x=Year*12+Month+Value-1
    set /a xYY=x/12
    set /a xMM=x%%12+1
    ::Korrektur, wenn Tag > 28 auf Monat mit weniger Tagen trifft
    for /l %%i in (0,-1,-3) do call :SetDate !xYY! !xMM! !Day! %%i & if !xMM! EQU !XX! goto :eof
goto :eof

::Berechnung mit Anzahl Jahre
: SetDateOfYears
    set /a xYY=Year+Value
    call :SetDate !xYY! !Month! !Day! 0
goto :eof


:: Datum berechnen
:SetDate %1 %2 %3 %4
:: Quelle: Ritchie Lawrence
    :: Func: Date from a Modified Julian Day.
    ::       Date (Day 0) is Wednesday 17th November 1858.
    set /a YY=%1,MM=%2,DD=%3,Number=%4
    set /a x=(14-MM)/12,y=YY+4800-x,d=(MM+12*x-3)*153+2,d=d/5+DD+y*365+y/4-y/100+y/400-1+Number
    set /a v1=(4*d+3)/146097,v2=(-v1*146097)/4+d,v3=(4*v2+3)/1461,v4=(-v3*1461)/4+v2,v5=(5*v4+2)/153
    set /a DD=(153*v5+2)/-5+v4+101,MM=(-v5/10)*12+v5+103,YY=v1*100+v3-4800+v5/10
    set /a XX=MM-100

:: Ergebnis
    set "DateResult=!DD:~-2!.!MM:~-2!.!YY!"  
    ::Wochentag So=1,Mo=2,Di=3,Mi=4,Do=5,Fr=6,Sa=7
    set /a WeekDay=(d+3)%%7+1

    ::@echo Datum    : !DateResult!
    ::@echo Wochentag: !WeekDay!
goto :eof
Wobei in Codezeile 62 das Ausgabeformat nach belieben angepasst werden kann

Quelle: hier und hier

Hier noch ne Batch mit Hilfe von VBS:
@echo off & setlocal

set "AnzahlTage=1"  

set "S=%temp%\GetStartTime.vbs"  
>%S% Echo D=Date-WScript.Arguments(0):WScript.Echo Year(D)^&Right("0"^&Month(D),2)^&Right("0"^&Day(D),2)  

for /f "tokens=1" %%d in ('cscript //nologo "%S%" %AnzahlTage%') do Set "Datum=%%d"  

echo %Datum%


Gruß Dieter
Tristement
Tristement 16.07.2013 um 00:41:21 Uhr
Goto Top
Uff das übersteigt a bissel meine kentnisse und ich glaub das muss ich mir erst ein mal 10 Mal anschauen um so a bissel was davon zu verstehen face-sad

Problem ist halt das alles über ne Bat laufen muss da der Admin zugang dicht ist und somit nur Boardmittel möglich sind da man nix insterlieren kann bei uns auf den Pc´s.

Werd mir die ganze sache mal von der Arbeit aus anschauen da ich vom heimrechner eh net auf den Server komme da deiser nur für die Pc´s auf der Arbeit frei sind.

Aber so a bissel überfordert mit den ganzen dingern da gerade.
u60u60
u60u60 16.07.2013 um 02:14:32 Uhr
Goto Top
Lass dich von der yesterday.bat nicht irritieren ... downloade die komplett und leg die in ein Arbeitsverzeichnis, zusammen mit dem Rest:

Hier erst mal der grobe Ueberblick ueber den Ablauf:

schritt 1.
ausfuehren von YESTERDAY.BAT von Endoro
echo dateiname-part1%Yesterday%dateiname-part2 > ausgabe-von-yesterday-bat

schritt 2.

ftp-anweisungs-file aktuell aus 3 Einzelteilen zusammenbasteln
copy ftp-part1 + ausgabe-von-yesterday-bat + ftp-part2 DatenHolen.ftp

schritt 3.
weiter mit deinem ftp download

Wichtig bei der yesterday.bat ist, das am Schluss 3 Variablen in weiteren Batches weiter verwendet werden koennen

Ich habe 4 (nach Aufruf 6) Dateien vorliegen:
(datei 1)
von http://www.robvanderwoude.com/datetiment.php#Download
die datei yesterday.bat (komplett!) downloaden

(datei 2) t1.bat
call yesterday.bat

REM --- benutze die Environment Variable Yesterday
REM --- vom Output aus yesterday.bat
REM --- und schreibe die neue kommandozeile fuer ftp aufruf in ydout.dat
echo GET RLP_CAUSER_0128_%Yesterday%.csv >ydout.dat

copy ftp1dat.txt + ydout.dat + ftp1dat.txt DatenHolen.ftp
REM --- hier kann dein weiterer FTP aufruf stehen ...
REM ftp -s:DatenHolen.ftp
REM Exit

(datei 3) ftp1dat.txt (1. Haelfte deiner FTP Anweisungen)
open ftp..de <== ist das hier richtig mit 2 Punkten?!?
USERNAME
PASSWORD
cd UNTERORTNERVERZEICHNISS

(datei 4) ftp2dat.txt (letzte Haelfte deiner FTP Anweisungen)
LCD Z:\Neuer Ordner\test\test3\Download

disconnect

bye

(datei 5) wird in t1.bat erstellt und hat nach Ausfuehrung nachfolgenden Inhalt
morgen natuerlich eins weiter face-smile
GET RLP_CAUSER_0128_20130715.csv

(datei 6) DatenHolen.ftp wird in t1.bat erstellt

---

laeuft sowohl unter WinXP, alsauch Windows7

sicherlich liesse sich das ganze noch mit pipes weiter vereinfachen

regards, uli face-wink
bastla
bastla 16.07.2013 um 09:03:15 Uhr
Goto Top
Hallo @ All!

Natürlich ist es hybsch, eine Batch-only-Lösung zu verwenden - aber zumeist schadet ein wenig "Inline-VBS" auch nicht wirklich; wenn das in diesem Fall auch so ist, ein Beispiel von mehreren, die sich hier finden lassen sollten: Dateien mit dem Datum von gestern in einen Ordner kopieren ...

Grüße
bastla
Invisan
Invisan 16.07.2013 aktualisiert um 10:49:53 Uhr
Goto Top
Moin Tristement.

Hier noch ein nur auf Batch basiernder Lösungsansatz um das aktuelle Datum -1 Tag zu bekommen.

Die Profis hier finden sicher nen schöneren Weg aber für mich tut das teil das was es soll ^^

@echo off &setlocal
for /f "tokens=1 delims=." %%a in ('date /t') do (  
  set "t=%%a"  
  setlocal enabledelayedexpansion
  set /a t=!t!-1
  echo Tag: !t!
)
for /f "tokens=2 delims=." %%b in ('date /t') do (  
  set "m=%%b"  
  echo Monat: !m!
)
for /f "tokens=3 delims=. " %%c in ('date /t') do (  
  set "y=%%c"  
  echo Jahr: !y!
)

echo !y!!m!!t!

Die Echos sind nur zur Veranschauung der ganzen Sache.

Im Prinzip holt sich das Skript über Date /t das aktuelle Datum trennt es an den . auf (Da das Datum im Format TT.MM.YYYY ist) und ändert es in den For-Schleifen so ab das jeweils nur alles vor dem ersten Punkt (!t!) nach dem ersten und vor dem 2ten Punkt (!m!) und nach dem ersten und 2ten Punkt (!y!) genutzt wird.

Das ganze wird dann als Tag !t! Monat !m! und Jahr !y! in die jeweiligen variablen geschrieben und kann dann in deinem Skript mit !y!!m!!t! für den Namen genutzt werden.


Mfg Invi
bastla
bastla 16.07.2013 um 10:34:08 Uhr
Goto Top
Hallo Invisian!

Eine Ergänzug würde ich auf jeden Fall noch vorschlagen (wenn Du "Code"-Formatierung verwendet hättest, könnte ich Dir auch die passende Zeilennummer nennen): Platziere unmittelbar vor der Zeile "setlocal enabledelayedexpansion"
if %t%==1 (echo Heute leider nicht verwendbar - versuchen Sie es morgen wieder! & pause & goto :eof)
Grüße
bastla
Invisan
Invisan 16.07.2013 um 10:51:08 Uhr
Goto Top
Zitat von @bastla:
Hallo Invisian!

Eine Ergänzug würde ich auf jeden Fall noch vorschlagen (wenn Du "Code"-[Formatierungen in den Beiträgen
Formatierung] verwendet hättest, könnte ich Dir auch die passende Zeilennummer nennen): Platziere unmittelbar vor der
Zeile "setlocal enabledelayedexpansion"
if %t%==1 (echo Heute leider nicht verwendbar - versuchen Sie es morgen wieder! & pause
> & goto :eof)
> 
Grüße
bastla

Hallo bastla stimmt da hast du recht bei nem -1 wären wir beim 01.08.2013 ja bei 0.

Mein Fehler ^^

Aber wie gesagt war halt ein schneller Versuch
Invisan
Invisan 16.07.2013 um 14:14:28 Uhr
Goto Top
So hier jetzt nochmal das neue Script diesmal mit Berücksichtigung des ersten und ebenfalls mit Berücksichtigung von Schaltjahren.


@echo off &setlocal
for /f "tokens=3 delims=. " %%c in ('date /t') do (  
setlocal enabledelayedexpansion
  set "y=%%c"  
)
for /f "tokens=2 delims=." %%b in ('date /t') do (  
setlocal enabledelayedexpansion
  set "m=%%b"  
)
for /f "tokens=1 delims=." %%a in ('date /t') do (  
setlocal enabledelayedexpansion
  set "t=%%a"  
  if !t! ==01 goto :checkmonth
  if !t! NEQ 01 goto :day
  
  :checkmonth
  if !m! ==01 goto :jan
  if !m! ==02 goto :feb
  if !m! ==03 goto :mar
  if !m! ==04 goto :apr
  if !m! ==05 goto :mai
  if !m! ==06 goto :jun
  if !m! ==07 goto :jul
  if !m! ==08 goto :aug
  if !m! ==09 goto :sep
  if !m! ==10 goto :okt
  if !m! ==11 goto :nov
  if !m! ==12 goto :dez
	
	
	:jan
				set /a y=!y!-1
				set m=12
				set t=31
				goto end
			    
	
	:feb
				set m=01
				set t=31
				goto end
	
				
	:mar
				set /a s=!y!-2000
				goto check

	:check
				if !s! GTR 4 goto :minus
				if !s! LSS 4 goto :keinschaltjahr
				if !s! == 4 goto :schaltjahr

	:minus
				set /a s=!s!-4
				goto check

		
	:keinschaltjahr		
				set m=02
				set t=28
				goto end

			
	:schaltjahr
				set m=02
				set t=29
				goto end
	
	:apr
				set m=03
				set t=31
				goto end

	:mai
				set m=04
				set t=30
				goto end

	:jun
				set m=05
				set t=31
				goto end
				
	:jul
				set m=06
				set t=30
				goto end
				
	:aug
				set m=07
				set t=31
				goto end
				
	:sep
				set m=08
				set t=31
				goto end
				
	:okt
				set m=09
				set t=30
				goto end
				
	:nov
				set m=10
				set t=31
				goto end
				
	:dez
				set m=11
				set t=30
				goto end
				
	:day
				set /a t=!t!-1
				goto end
			
	:end
				echo !y!!m!!t!
)
Tristement
Tristement 17.07.2013 aktualisiert um 07:36:02 Uhr
Goto Top
Hallo u60u60

Da deine Anleitung an und für sich bisher für mich am verständlichsten war habe ich die mal versucht diese zu nehmen, jedoch scheitert es noch an einiges stellen bei mir ! Ich schreibe mal unter den Zeilen die du verfasst hast wie und wo es noch bei mir a bissel hängt , da ich leider bisher mit Bat keine erfahrungen habe und mir halt nur alles aus dem netz zusammen suche bitte ich um ein wenig verständniss face-big-smile


Zitat von @u60u60:
Lass dich von der yesterday.bat nicht irritieren ... downloade die komplett und leg die in ein Arbeitsverzeichnis, zusammen mit
dem Rest:

Hier erst mal der grobe Ueberblick ueber den Ablauf:

schritt 1.
ausfuehren von YESTERDAY.BAT von Endoro
echo dateiname-part1%Yesterday%dateiname-part2 > ausgabe-von-yesterday-bat

*TRISTEMENT* : hier hänge ich schon fest , wo genau kommt der befehl rein?

schritt 2.

ftp-anweisungs-file aktuell aus 3 Einzelteilen zusammenbasteln
copy ftp-part1 + ausgabe-von-yesterday-bat + ftp-part2 DatenHolen.ftp

*TRISTEMENT* : ich habe wirklich keine ahnung was das hier zu bedeuten hat face-sad

schritt 3.
weiter mit deinem ftp download

Wichtig bei der yesterday.bat ist, das am Schluss 3 Variablen in weiteren Batches weiter verwendet werden koennen

*TRISTEMENT* :nun kommt wirklich nur noch Bahnhof bei mir an

Ich habe 4 (nach Aufruf 6) Dateien vorliegen:
(datei 1)
von http://www.robvanderwoude.com/datetiment.php#Download
die datei yesterday.bat (komplett!) downloaden

*TRISTEMENT* :Habe ich gemacht und diese als Yesterday.bat abgespeichert

(datei 2) t1.bat
call yesterday.bat

REM --- benutze die Environment Variable Yesterday
REM --- vom Output aus yesterday.bat
REM --- und schreibe die neue kommandozeile fuer ftp aufruf in ydout.dat
echo GET RLP_CAUSER_0128_%Yesterday%.csv >ydout.dat

copy ftp1dat.txt + ydout.dat + ftp1dat.txt DatenHolen.ftp
REM --- hier kann dein weiterer FTP aufruf stehen ...
REM ftp -s:DatenHolen.ftp
REM Exit

*TRISTEMENT* :t1.bat wurde erstellt und mit dem Code von dir versehen, aber was bedeutet die Zeile hier kann dein Weiterer FTP aufruf stehen? Muss ich etwas von mir rein oder nicht?

................................................

(datei 3) ftp1dat.txt (1. Haelfte deiner FTP Anweisungen)
open ftp..de <== ist das hier richtig mit 2 Punkten?!?
USERNAME
PASSWORD
cd UNTERORTNERVERZEICHNISS

*TRISTEMENT* :Nein, die 2 Punkte sind nicht richtig da stehen normalerweise Sternchen drinne, hätte auch XXXX machen können aber die wurden hier scheinbar nicht angezteigt, ftp1dat.txt wurde auch erstellt samt FTP aufruf wie von dir beschrieben (mit meinen Zugansdaten)

................................................

(datei 4) ftp2dat.txt (letzte Haelfte deiner FTP Anweisungen)
LCD Z:\Neuer Ordner\test\test3\Download

disconnect

bye

*TRISTEMENT* :auch die ftp2dat.exe habe ich samt inhalt erstellt
................................................

(datei 5) wird in t1.bat erstellt und hat nach Ausfuehrung nachfolgenden Inhalt
morgen natuerlich eins weiter face-smile
GET RLP_CAUSER_0128_20130715.csv

*TRISTEMENT* : Muss ich hier was machen oder geht das dann von alleine ?

.................................................

(datei 6) DatenHolen.ftp wird in t1.bat erstellt

*TRISTEMENT* :Hier die selbe frage ? Geht das von alleine oder muss ich etwas tun?

---

laeuft sowohl unter WinXP, alsauch Windows7

sicherlich liesse sich das ganze noch mit pipes weiter vereinfachen

regards, uli face-wink


Immer wieder sehe ich meine DatenHolen.ftp muss ich diese doch wieder anlegen und wenn ja was muss da rein?
Vorallem wenn das stück mal fertig ist über welche Bat Datei wird das ganze denn gestartet ?

Sry für die für euch eventuellen dummen fragen aber ich bin wie erwähnt noch neuling in Batch und bedanke mich schon mal für die tolle hilfe hier bei euch
Invisan
Invisan 17.07.2013 aktualisiert um 10:08:43 Uhr
Goto Top
Hi Tristement,

hier mal meine Version inklusive ftp Datenteil etc.

Einfach alles in eine Bat kopieren Pfad unten abändern und mal testen da ich hier keine FTP Freigabe zum testen habe.


::FTP Downloader
::by Invisan 2013

@echo off &setlocal
::Hier wird das Jahr rausgefiltert
for /f "tokens=3 delims=. " %%c in ('date /t') do (  
setlocal enabledelayedexpansion
  set "jahr=%%c"  
)
::Hier wird der Monat ausgefiltert
for /f "tokens=2 delims=." %%b in ('date /t') do (  
setlocal enabledelayedexpansion
  set "monat=%%b"  
)
::Hier wird der Tag ausgefiltert
for /f "tokens=1 delims=." %%a in ('date /t') do (  
setlocal enabledelayedexpansion
  set "tag=%%a"  
  ::Wenn der erste erreicht ist beginnt der test welcher Tag der vorherige war.
  if !tag! ==01 goto :checkmonth
  ::Wenn der nicht der erste ist gehe weiter nach day
  if !tag! NEQ 01 goto :day
  
  ::Teste welcher Monat ist um den Tag zuzuweisen
  :checkmonth
  if !monat! ==01 goto :jan
  if !monat! ==02 goto :feb
  if !monat! ==03 goto :mar
  if !monat! ==04 goto :apr
  if !monat! ==05 goto :mai
  if !monat! ==06 goto :jun
  if !monat! ==07 goto :jul
  if !monat! ==08 goto :aug
  if !monat! ==09 goto :sep
  if !monat! ==10 goto :okt
  if !monat! ==11 goto :nov
  if !monat! ==12 goto :dez
	
	
	:jan
				set /a jahr=!jahr!-1
				set monat=12
				set tag=31
				goto end
			    
	
	:feb
				set monat=01
				set tag=31
				goto end
	
				
	:mar
				::Da der Februar im Schaltjahr 29 Tage hat setze Jahr -2000 damit die Berechnung nicht so lange dauert.
				set /a s=!jahr!-2000
				goto check

	:check
				::Wenn s größer als 4 (ab 2005) gehe zu Minus
				::Wenn s kleiner als 4 gehe zu keinschaltjahr
				::Wenn s gleich 4 gehe zu schaltjahr
				if !s! GTR 4 goto :minus
				if !s! LSS 4 goto :keinschaltjahr
				if !s! == 4 goto :schaltjahr

	:minus
				::Da s noch größer als 4 ist Rechne s-4 und gehe zurück zu check bis s kleiner oder gleich 4
				set /a s=!s!-4
				goto check

		
	:keinschaltjahr		
				::S ist kleiner als 4 daher ist das Jahr kein Schaltjahr
				set monat=02
				set tag=28
				goto end

			
	:schaltjahr
				::S ist gleich 4 daher ist das Jahr ein Schaltjahr
				set monat=02
				set tag=29
				goto end
	
	:apr
				set monat=03
				set tag=31
				goto end

	:mai
				set monat=04
				set tag=30
				goto end

	:jun
				set monat=05
				set tag=31
				goto end
				
	:jul
				set monat=06
				set tag=30
				goto end
				
	:aug
				set monat=07
				set tag=31
				goto end
				
	:sep
				set monat=08
				set tag=31
				goto end
				
	:okt
				set monat=09
				set tag=30
				goto end
				
	:nov
				set monat=10
				set tag=31
				goto end
				
	:dez
				set monat=11
				set tag=30
				goto end
				
	:day
				set /a tag=!tag!-1
				goto end
)

:end

::Hier werden die benötigten FTP Daten in die Datei D:\copyit.ftp geschrieben
echo open ftp.*.de >>D:\copyit.ftp
echo USERNAME >>D:\copyit.ftp
echo PASSWORD >>D:\copyit.ftp
echo cd UNTERORTNERVERZEICHNISS >>D:\copyit.ftp

::Hier werden die Variablen von oben genutzt um Jahr Monat und Tag in den Dateinamen einzufügen.
echo GET RLP_CAUSER_0128_!jahr!!monat!!tag!.csv >>D:\copyit.ftp

echo LCD "Z:\Neuer Ordner\test\test3\Download" >>D:\copyit.ftp  

echo disconnect >>D:\copyit.ftp

echo bye >>D:\copyit.ftp

::Hier erfolgt jetzt der Aufruf des FTP Commands
ftp -s D:\copyit.ftp


Falls du noch Fragen dazu hast frag ruhig.


Mit freundlichen Grüßen,

Invisan


P.S.: Bevor du testest lösch die Kommentare aus dem Script damit scheint er nicht klar zu kommen.
u60u60
u60u60 17.07.2013 um 12:28:58 Uhr
Goto Top
Zitat von @Tristement:
Hallo u60u60

Da deine Anleitung an und für sich bisher für mich am verständlichsten war habe ich die mal versucht diese zu
nehmen, jedoch scheitert es noch an einiges stellen bei mir ! Ich schreibe mal unter den Zeilen die du verfasst hast wie und wo es
noch bei mir a bissel hängt , da ich leider bisher mit Bat keine erfahrungen habe und mir halt nur alles aus dem netz
zusammen suche bitte ich um ein wenig verständniss face-big-smile


> Zitat von @u60u60:
> ----
> Lass dich von der yesterday.bat nicht irritieren ... downloade die komplett und leg die in ein Arbeitsverzeichnis, zusammen
mit
> dem Rest:
>
> Hier erst mal der grobe Ueberblick ueber den Ablauf:
>
> schritt 1.
> ausfuehren von YESTERDAY.BAT von Endoro
> echo dateiname-part1%Yesterday%dateiname-part2 > ausgabe-von-yesterday-bat

*TRISTEMENT* : hier hänge ich schon fest , wo genau kommt der befehl rein?
>

Das ist nur erst einmal zur Erklaerung, was der Reihe nach passieren soll
Hier ist noch keine Zuordnung zu irgendwelchen Batches / Dateien beschrieben
Also erstmal nur alles graue Theorie, was der Reihe nach passieren soll, damit ein Schuh draus wird ...

Prinzipiell sollen die 2 Zeilen nur die vorbereitenden Schritte bedeuten, bevor du mit irgendeinem FTP Download in irgendeiner Batch starten kannst.

Das Script soll zum Schluss einfach die von Endoro vorgestellte Batch (die also einmal komplett downloaden) aufrufen.

Die Batch YESTERDAY.BAT ist dazu weder zu veraendern, noch sonst irgendwie zu modifizieren. Bleibt also als Standalone Batch im Orginalzustand erhalten. Wird nur durch eine Haupt-Batch, die ich hier erst einmal theoretisch vorstelle, einmalig aufgerufen, um den Datumswert von GESTERN zu ermitteln, der nach Aufruf von YESTERDAY.BAT in einer Umgebungsvariablen zu finden ist.


Die zweite Zeile generiert ein Stueck des Code Schnipsels den du fuer das jeweils aktuelle FTP Download Script benoetigst und genau nur die "veraenderliche" Zeile deines urspruenglichen FTP Download Script Datei enthaelt.
Dieses wird eben in eine temporaere Datei hineingeschrieben.
Diese Datei wird im naechsten Schritt dann wieder benoetigt ...


> schritt 2.
>
> ftp-anweisungs-file aktuell aus 3 Einzelteilen zusammenbasteln
> copy ftp-part1 + ausgabe-von-yesterday-bat + ftp-part2 DatenHolen.ftp

*TRISTEMENT* : ich habe wirklich keine ahnung was das hier zu bedeuten hat face-sad

Wir basteln uns eine neue FTP Download Script Datei zusammen, die wir spaeter beim FTP Download Aufruf benoetigen werden.

Diese FTP Download Script Datei wird dabei aus mehreren Schnipseln jeweils neu zusammengefuegt.

Dazu habe ich von deiner ersten Anzeige genau diese Datei in 3 Stuecke zerteilt.
Part1 ... das was _vor_ dem "veraenderlichen" Teil alles steht
Part2 ... der "veraenderliche" Teil, der bei jedem Aufruf der Gesamtbatch neu
erzeugt wird, was genau in Schritt 1 - Zeile 2 passierte -und-
Part3 ... was in deinem orginalen FTP Script noch hintendran kam

Diese 3 (Daten) Dateischnipsel kopieren wir mit einer Befehlszeile zusammen, die dann das fertige, jeweils neu zu benutzende FTP Script darstellen, was wir fuer den FTP Download Aufruf benoetigen.

Dieses FTP Download Script enthaelt ja den variablen Dateinamen, der per ftp herunter geladen werden soll. Also muss dieses FTP Download Script jedesmal aktuell neu zusammengebaut werden.
Und genau das macht Schritt 2 hier ...


>
> schritt 3.
> weiter mit deinem ftp download
>
> Wichtig bei der yesterday.bat ist, das am Schluss 3 Variablen in weiteren Batches weiter verwendet werden koennen

*TRISTEMENT* :nun kommt wirklich nur noch Bahnhof bei mir an

jetzt kommt dein, in deiner Aufgabenstellung aufgezeigte Aufruf fuer deinen FTP Download der mit jedem Tag mit einem anderen Namen erfolgen soll ...

der FTP Aufruf selbst setzt sich aus 2 Teilen zusammen

FTP -s:

und hintendran gehaengt ein Dateiname, der die Anweisungen fuer das FTP Programm enthaelt. Die Anweisungen fuer das FTP Programm haben wir in den ganzen Schritten zuvor jeweils neu zusammengebastelt und in die Datei - du hattest die in deiner Aufgabenstellung als "DatenHolen.ftp" bezeichnet - hineinkopiert/weggeschrieben


Ok ... nach der ganzen Theorie kommt jetzt die Praxis: face-smile


>
> Ich habe 4 (nach Aufruf 6) Dateien vorliegen:
> -----------------------------------------------------------------------------
> (datei 1)
> von http://www.robvanderwoude.com/datetiment.php#Download
> die datei yesterday.bat (komplett!) downloaden

*TRISTEMENT* :Habe ich gemacht und diese als Yesterday.bat abgespeichert

fein ... die bleibt so unveraendert


die nachfolgende Datei wird die HAUPT-Batch, mit der du jeden Tag den FTP Download anstoesst ...

>
> (datei 2) t1.bat
> ................................................
> call yesterday.bat
>
> REM --- benutze die Environment Variable Yesterday
> REM --- vom Output aus yesterday.bat
> REM --- und schreibe die neue kommandozeile fuer ftp aufruf in ydout.dat
> echo GET RLP_CAUSER_0128_%Yesterday%.csv >ydout.dat
>
> copy ftp1dat.txt + ydout.dat + ftp1dat.txt DatenHolen.ftp

---

> REM --- hier kann dein weiterer FTP aufruf stehen ...
> REM ftp -s:DatenHolen.ftp
> REM Exit

*TRISTEMENT* :t1.bat wurde erstellt und mit dem Code von dir versehen, aber was bedeutet die Zeile hier kann dein Weiterer FTP
aufruf stehen? Muss ich etwas von mir rein oder nicht?

bis zu dem Zwischenteil (nach dem COPY ....)
kannst du erst einmal versuchen die Datei aufzurufen, um zu testen, ob die Datei DATENHOLEN.FTP jeweils das von dir gewuenschte Ergebnis enthaelt.
Den Aufruf der Datei, die im Namen das Datum von Gestern enthaelt ...

Wenn das funktioniert, kannst du bei den letzten beiden Zeilen
> REM ftp -s:DatenHolen.ftp
> REM Exit
jeweils das REM (REM steht fuer Remark - Beschreibung) und hat hier erst einmal die Funktion, das der FTP Aufruf und das Exit noch nicht ausgefuehrt werden.
Nach dem Testen muessten dann die Zeilen dann wie folgt aussehen:

REM
ftp -s:DatenHolen.ftp
REM
Exit

Das hab ich bei mir zum Testen so gemacht, das nicht jedesmal tatsaechlich ein FTP Download startet, das ich erst einmal sehe, ob die Zeilen vorher alle funktionieren ...



> ................................................
>
> (datei 3) ftp1dat.txt (1. Haelfte deiner FTP Anweisungen)
> ................................................
> open ftp..de <== ist das hier richtig mit 2 Punkten?!?
> USERNAME
> PASSWORD
> cd UNTERORTNERVERZEICHNISS

*TRISTEMENT* :Nein, die 2 Punkte sind nicht richtig da stehen normalerweise Sternchen drinne, hätte auch XXXX machen
können aber die wurden hier scheinbar nicht angezteigt, ftp1dat.txt wurde auch erstellt samt FTP aufruf wie von dir
beschrieben (mit meinen Zugansdaten)

ok soweit



> ................................................
>
> (datei 4) ftp2dat.txt (letzte Haelfte deiner FTP Anweisungen)
> ................................................
> LCD Z:\Neuer Ordner\test\test3\Download
>
> disconnect
>
> bye

*TRISTEMENT* :auch die ftp2dat.exe habe ich samt inhalt erstellt

nicht ftp2dat.EXE sondern ftp2dat.TXT
EXE ist fuer Windows ein ausfuehrbarer Code ...
hier wollen wir aber erst nur Datenschnipsel ablegen. Deswegen Dateiendung .TXT


> ................................................
>
> (datei 5) wird in t1.bat erstellt und hat nach Ausfuehrung nachfolgenden Inhalt
> morgen natuerlich eins weiter face-smile
> .................................................
> GET RLP_CAUSER_0128_20130715.csv

*TRISTEMENT* : Muss ich hier was machen oder geht das dann von alleine ?

um diese Datei brauchst du dich nicht drum kuemmern ...
die wird durch die Batch jedesmal neu erstellt ...
Ich habe die Datei nur der Vollstaendigkeit halber hier benannt, das die nach Aufruf der T1.BAT auch in diesem Arbeitsverzeichnis zu finden ist ...



> .................................................
>
> (datei 6) DatenHolen.ftp wird in t1.bat erstellt

*TRISTEMENT* :Hier die selbe frage ? Geht das von alleine oder muss ich etwas tun?

Diese Datei wird durch die Haupt-Batch T1.BAT aus den weiter oben beschriebenen 3 Teilen jeweils neu erzeugt.
Wie zuvor die Datei schon, dient dies hier nur als zusaetzliche Information, das nach Aufruf der T1.BAT diese Datei auch im Verzeichnis zu finden ist


>
> ---
>
> laeuft sowohl unter WinXP, alsauch Windows7
>
> sicherlich liesse sich das ganze noch mit pipes weiter vereinfachen
>
> regards, uli face-wink


Immer wieder sehe ich meine DatenHolen.ftp muss ich diese doch wieder anlegen und wenn ja was muss da rein?

Ja, die DatenHolen.Ftp ist eine "wichtige" Datei face-smile
da die ja den Zugang zum FTP Server realisiert
Nein, du musst diese Datei nicht selbst erstellen.
Das erledigt schon die Batch T1.BAT - und zwar bei jedem Aufruf wird die Datei DatenHolen.Ftp neu erstellt


Vorallem wenn das stück mal fertig ist über welche Bat Datei wird das ganze denn gestartet ?

T1.BAT

du kannst diese HAUPT-Batch auch umbenennen in START.bat oder
MeinFtpDownload.bat oder was auch immer fuer einen Namen ...
T1.bat hatte ich die nur erst einmal in meinem eigenen Testlauf genannt



Sry für die für euch eventuellen dummen fragen aber ich bin wie erwähnt noch neuling in Batch und bedanke mich

du brauchst dich nicht zu entschuldigen ... ich habe auch mal irgendwann damit angefangen ... allerdings liegt das schon Jahre zurueck ...
Vielleicht kennst du ja den Spruch "Es ist noch kein Meister vom Himmel gefallen", aber das spricht es zutreffend aus ,-)

schon mal für die tolle hilfe hier bei euch

gern geschehen, keine Ursache ...


regards, uli face-wink
Tristement
Tristement 18.07.2013 um 10:09:54 Uhr
Goto Top
So, ich hab nun mal beide Varianten getestet , die von u60u60 und Invisan!

Die von Invisan bekomm ich bisher noch nicht zum Laufen habs aber auch nur kurz getestet da wenig zeit war, wo genau der fehler liegt weiß ich noch net genau , sofern a bissel mehr zeit ist schau ich da mal nach.

Die von U60u60 rennt so weit , es hängt sich iwo in der mitte noch auf da das cmd fenster stehen bleibt und nen fehler schmeißt und nur schwer zu schließen ist, aber es hat zumindest die datei heruntergeladen face-big-smile

Nun ist mir heute Nacht aber noch nen Problem eingefallen face-sad

Die Batch Datei holt mir ja immer nur die Datei vom Vortag ! Soll ja auch so sein , aber was mache ich nun am Montag ? Da der PC am Samsatg nicht Läuft würde mir ja die Datei vom Freitag fehlen und am Montag würde er nix herunterladen da ja Sontags keine Datein erstellt wurden.
Invisan
Invisan 18.07.2013 um 10:19:06 Uhr
Goto Top
Zitat von @Tristement:
So, ich hab nun mal beide Varianten getestet , die von u60u60 und Invisan!

Die von Invisan bekomm ich bisher noch nicht zum Laufen habs aber auch nur kurz getestet da wenig zeit war, wo genau der fehler
liegt weiß ich noch net genau , sofern a bissel mehr zeit ist schau ich da mal nach.

Die von U60u60 rennt so weit , es hängt sich iwo in der mitte noch auf da das cmd fenster stehen bleibt und nen fehler
schmeißt und nur schwer zu schließen ist, aber es hat zumindest die datei heruntergeladen face-big-smile

Nun ist mir heute Nacht aber noch nen Problem eingefallen face-sad

Die Batch Datei holt mir ja immer nur die Datei vom Vortag ! Soll ja auch so sein , aber was mache ich nun am Montag ? Da der PC
am Samsatg nicht Läuft würde mir ja die Datei vom Freitag fehlen und am Montag würde er nix herunterladen da ja
Sontags keine Datein erstellt wurden.


Hallo Tristement.

Wie in meinem Beitrag schon geschrieben musst du die ganzen Kommentare rauslöschen sprich alles was mit :: beginnt danach sollte mein Skript Problemlos laufen.
Invisan
Invisan 18.07.2013 aktualisiert um 14:21:53 Uhr
Goto Top
Hier jetzt nochmal die optimierte Version die am Montag auf Freitag springt (sozusagen)

EDIT: Nochmal ne neue verkürzte Version.


@echo off &setlocal
for /f "tokens=3 delims=. " %%c in ('date /t') do (  
setlocal enabledelayedexpansion
  set "jahr=%%c"  
)
for /f "tokens=2 delims=." %%b in ('date /t') do (  
setlocal enabledelayedexpansion
  set "monat=%%b"  
)
for /f %%g in ('wmic path win32_localtime get dayofweek^|findstr /v /r "^$"') do (  
setlocal enabledelayedexpansion
	set DOW=%%g
)
for /f "tokens=1 delims=." %%a in ('date /t') do (  
setlocal enabledelayedexpansion
				set "tag=%%a"  
				set test=2
  
				if !DOW! GTR 1 goto :welcome
				if !DOW!==1 goto :one
				
	:one 
				set /a test=!test!-1
				if !tag!==01 goto :checkmonth
				set /a tag=!tag!-1
				if !test! GTR 0 goto :one
  
  
	:welcome
				if !tag! ==01 goto :checkmonth
				if !tag! NEQ 01 goto :day
  
	:checkmonth
				echo check
				if !monat! ==01 goto :eins
				if !monat! ==02 goto :zwei
				if !monat! ==03 goto :mar
				if !monat! ==04 goto :zwei
				if !monat! ==05 goto :drei
				if !monat! ==06 goto :zwei
				if !monat! ==07 goto :drei
				if !monat! ==08 goto :zwei
				if !monat! ==09 goto :zwei
				if !monat! ==10 goto :drei
				if !monat! ==11 goto :zwei
				if !monat! ==12 goto :drei
	
	
	:eins
				set /a jahr=!jahr!-1
				set monat=12
				set tag=31
				if !test! GTR 0 goto :one
				goto end
			    
	
	:zwei
				set /a monat=!monat!-1
				set tag=31
				if !test! GTR 0 goto :one
				goto end
				
	:drei		
				set /a monat=!monat!-1
				set tag=30
				if !test! GTR 0 goto :one
				goto end
				
	:mar
				set /a s=!jahr!-2000
				goto check

	:check
				if !s! GTR 4 goto :minus
				if !s! LSS 4 goto :keinschaltjahr
				if !s! == 4 goto :schaltjahr

	:minus
				set /a s=!s!-4
				goto check

		
	:keinschaltjahr		
				set monat=02
				set tag=28
				if !test! GTR 0 goto :one
				goto end

			
	:schaltjahr
				set monat=02
				set tag=29
				if !test! GTR 0 goto :one
				goto end
				
	:day
				set /a tag=!tag!-1
				goto end
				
			
)

:end



echo open ftp.*.de >>D:\copyit.ftp
echo USERNAME >>D:\copyit.ftp
echo PASSWORD >>D:\copyit.ftp
echo cd UNTERORTNERVERZEICHNISS >>D:\copyit.ftp

echo GET RLP_CAUSER_0128_!jahr!!monat!!tag!.csv >>D:\copyit.ftp

echo LCD "Z:\Neuer Ordner\test\test3\Download" >>D:\copyit.ftp  

echo disconnect >>D:\copyit.ftp

echo bye >>D:\copyit.ftp

ftp -s copy.ftp
bastla
bastla 18.07.2013 um 12:55:43 Uhr
Goto Top
Hallo @ All!

Da das hier dem Ende zugeht, vielleicht doch noch eine Alternativvariante zur Berechnung des Datums von gestern (bzw des Freitags davor, falls das Ergebnis ein Sonntag wäre):
set "Script=%temp%\GesternSpezial.vbs"  
>"%Script%" echo T=DateAdd("d",-1,Date):If Weekday(T)=1 Then:T=DateAdd("d",-2,T):End If:WScript.Echo T  
for /f "tokens=1-3 delims=." %%a in ('cscript //nologo "%Script%"') do (  
    set "tag=%%a"  
    set "monat=%%b"  
    set "jahr=%%c"  
)
del "%Script%"  
Grüße
bastla
76109
76109 18.07.2013 aktualisiert um 14:56:09 Uhr
Goto Top
Hallo @all!

Oder das Ganze gleich mit einem Script erledigen (*.vbs):
'Ftp-Daten entsprechend anpassen*****************************************  
 Const Z1 = "ftp.*.de"  
 Const Z2 = "Username"  
 Const Z3 = "Passwort"  
 Const Z4 = "CD Unterverzeichnis"  
 Const Z5 = "GET RLP_CAUSER_0128_%Date%.csv"  '%Date% wird vom Code ersetzt  
 Const Z6 = "LCD Z:\Test\Download"  
 Const Z7 = "Disconnect"  
 Const Z8 = "Bye"  
'Ftp-Daten**************************************************************  

'Wird im Script-Verzeichnis erstellt/überschrieben  
 Const sFtpFileName = "CsvDatenDownload.ftp"  

'Ftp-Datei wird angefügt  
 Const sFtpCmdLine = "ftp -s:"  

 Set oShell = CreateObject("WScript.Shell")  
 Set oFso = CreateObject("Scripting.FileSystemObject")  

 'Aktuelles Datum -1  
 dDate = Date - 1

 'Wenn Datum vom Montag, dann Datum vom Freitag  
 If Weekday(dDate) = vbSunday Then
    dDate = dDate - 2
 End If

'DateFormat YYYYMMDD  
 sDate = Year(dDate) & Right("0" & Month(dDate), 2) & Right("0" & Day(dDate), 2)  

'Date in Dateinamen einfügen  
 sZ5 = Replace(Z5, "%Date%", sDate)  

'Ftp-Text erzeugen  
 sFtpText = Join(Array(Z1, Z2, Z3, Z4, sZ5, Z6, Z7, Z8), vbNewLine)

'Ftp-Dateinamen erzeugen  
 sFile = oFso.GetParentFolderName(Wscript.ScriptFullName) & "\" & sFtpFileName  

'Ftp-Datei schreiben  
 oFso.CreateTextFile(sFile).Write sFtpText

'Ftp-CommandLine erzeugen  
 sCmdLine = sFtpCmdLine & Chr(34) & sFile & Chr(34)

'Pause 200 Millisekunden  
 Wscript.Sleep 200

'Datei downloaden  
'oShell.Run sCmdLine, 0, False  

Nachdem Du die Daten von Zeile 2-9 angepasst hast, startest Du das Script und schaust Dir zur Kontrolle die "CsvDatenDownload.ftp"-Datei im Script-Verzeichnis an und korrigierst gegebenenfalls die Codezeilen 2-9.

Wenn soweit alles korrekt ist, dann entfernst Du in der letzten Codezeile im Script das Kommentarzeichen (') vor "oShell.Run sCmdLine, 0, False" und startest das Script erneut. Im Idealfall sollte dann der Download der Csv-Datei erfolgen.

Gruß Dieter
Invisan
Invisan 18.07.2013 um 13:32:05 Uhr
Goto Top
Zitat von @76109:
Hallo @all!

Oder das Ganze gleich mit einem Script erledigen (*.vbs):
> 'Ftp-Daten entsprechend anpassen*****************************************  
>  Const Z1 = "ftp.*.de"  
>  Const Z2 = "Username"  
>  Const Z3 = "Passwort"  
>  Const Z4 = "CD Unterverzeichnis"  
>  Const Z5 = "GET RLP_CAUSER_0128_%Date%.csv"  '%Date% wird vom Code ersetzt  
>  Const Z6 = "LCD Z:\Test\Download"  
>  Const Z7 = "Disconnect"  
>  Const Z8 = "Bye"  
> 'Ftp-Daten**************************************************************  
> 
> 'Wird im Script-Verzeichnis erstellt/überschrieben  
>  Const sFtpFileName = "CsvDatenDownload.ftp"  
> 
> 'Ftp-Datei wird angefügt  
>  Const sFtpCmdLine = "ftp -s:"  
> 
>  Set oShell = CreateObject("WScript.Shell")  
>  Set oFso = CreateObject("Scripting.FileSystemObject")  
> 
>  'Aktuelles Datum -1  
>  dDate = Date - 1
> 
>  'Wenn Datum vom Montag, dann Datum vom Freitag  
>  If Weekday(dDate) = vbMonday Then
>     dDate = dDate - 2
>  End If
> 
> 'DateFormat YYYYMMDD  
>  sDate = Year(dDate) & Right("0" & Month(dDate), 2) & Right("0" & Day(dDate), 2)  
> 
> 'Date in Dateinamen einfügen  
>  sZ5 = Replace(Z5, "%Date%", sDate)  
> 
> 'Ftp-Text erzeugen  
>  sFtpText = Join(Array(Z1, Z2, Z3, Z4, sZ5, Z6, Z7, Z8), vbNewLine)
> 
> 'Ftp-Dateinamen erzeugen  
>  sFile = oFso.GetParentFolderName(Wscript.ScriptFullName) & "\" & sFtpFileName  
> 
> 'Ftp-Datei schreiben  
>  oFso.CreateTextFile(sFile).Write sFtpText
> 
> 'Ftp-CommandLine erzeugen  
>  sCmdLine = sFtpCmdLine & Chr(34) & sFile & Chr(34)
> 
> 'Pause 200 Millisekunden  
>  Wscript.Sleep 200
> 
> 'Datei downloaden  
> 'oShell.Run sCmdLine, 0, False  
> 

Nachdem Du die Daten von Zeile 2-9 angepasst hast, startest Du das Script und schaust Dir zur Kontrolle die
"CsvDatenDownload.ftp"-Datei im Script-Verzeichnis an und korrigierst gegebenenfalls die Codezeilen 2-9.

Wenn soweit alles korrekt ist, dann entfernst Du in der letzten Codezeile im Script das Kommentarzeichen (') vor
"oShell.Run sCmdLine, 0, False" und startest das Script erneut. Im Idealfall sollte dann der Download der Csv-Datei
erfolgen.

Gruß Dieter


Hallo Dieter,

ist doch bei meiner Variante auch mit einem einzigen Skript abgedeckt nur halt kein VBS sondern Plain Batch ;)

Mfg Invi
76109
76109 18.07.2013 aktualisiert um 14:07:19 Uhr
Goto Top
Hallo Invisan!

Sorry, hatte ich doch glatt übersehen und Du hast Dir ja reichlich Mühe gegebenface-smile

Kein Wunder bei diesen riesen Kommentaren verliert man leicht den Überblick...face-wink

Gruß Dieter
Invisan
Invisan 18.07.2013 um 14:23:29 Uhr
Goto Top
Zitat von @76109:
Hallo Invisan!

Sorry, hatte ich doch glatt übersehen und Du hast Dir ja reichlich Mühe gegebenface-smile

Kein Wunder bei diesen riesen Kommentaren verliert man leicht den Überblick...face-wink

Gruß Dieter


Stimmt was das Überblick verlieren angeht hast du recht

Hab das ganze jetzt nochmal umgeschrieben und auf 120 Zeilen verkürzt.

Selbst schuld wenn man so dämlich is und jedesmal wieder Monat und Tag explizit für den Monat angibt anstatt das automatisch zu berechnen
"

Mfg Invi
u60u60
u60u60 18.07.2013 um 14:38:29 Uhr
Goto Top
Aufhaengen ... ich habe 3 Vermutungen ...
die eine sind die Registry Zugriffe (Auslesen der Localised Datums Umgebung)
die #2 ist das ftp script selber das noch haengt und noch nicht abgeschlossen ist
die #3 Aufruf der Batch + Aufruf des FTP scripts mit Exit beendet noch nichts zwangslaeufig die Batch ?!?

Wie dem auch sei ... mit dem "Montag" Problem ist die vormalige Loesung alleine nur bedingt laeuffaehig ... da bedarf es weiterer Scripte von http://www.robvanderwoude.com/datetiment.php#Download
Um das Problem mit der T1.BAT zu loesen werden weitere Scripte benoetigt:
datepart.bat um den Wochentag zu bestimmen
dateadd.bat um am Montag 3 Tage zurueckzurechnen heute minus 3 tage
datefmt.bat die downloadbare vom obigen Link liefert nur das Format vom heutigen Tag face-sad ... dazu bedarf es einer Anpassung dieser Batch um auch ein Customized Datum zu uebergeben und umzuwandeln

Ok: http://www.robvanderwoude.com/files/datefmt_nt.txt abspeichern als datefmt.bat

Davon erstelle bitte eine Kopie nach datefmt2.bat

Nun datefmt2.bat editieren:
Zeile 4
IF NOT "%~6"=="" GOTO Syntax
ersetzen gegen
IF NOT "%~7"=="" GOTO Syntax

Zeile 11
FOR /F "tokens=1-3 delims=(/-)" %%B IN ("!DateFmt!") DO (
ersetzen gegen
FOR /F "tokens=1-3 delims=(./-)" %%B IN ("!DateFmt!") DO (

Zeile 21 einfuegen:

REM using customized date as last parameter
REM /LZ maybe on pos 4 or pos5
IF /I "%~5"=="/LZ" (SET Today=%6)
IF /I "%~4"=="/LZ" (SET Today=%5)
IF /I "!Today!"=="" (SET Today=!%%A!)


Zeile 73 (+/- 1 oder 2 Zeilen)
ECHO Usage: DATEFMT date_format [ delimiter ] [ /LZ ]
ersetzen gegen
ECHO Usage: DATEFMT date_format [ delimiter ] [ /LZ ] [ custom_date ]

ungefaehr Zeile 83 nach
ECHO /LZ use leading zeroes in the end result
folgende Zeile einfuegen
ECHO custom_date use another date then TODAY in localized format

Am Ende der Beispiele (ungefaehr Zeile 93)
kannst du noch nachfolgendes Beispiel einfuegen
ECHO DATEFMT yy mm dd * /LZ 01/15/2007 --- 07*01*15 (January 15, 2007)

Datei speichern.


Die anderen Batches
datepart.bat
dateadd.bat
hast du dir auch schon runtergeladen und abgespeichert?
Dann ist das jetzt der passende Zeitpunkt face-smile

Die T1.BAT ist nun anzupassen.
Dazu am besten komplette T1.BAT nehmen:
call datepart.bat w
if "%DatePart%"=="1" GOTO getfriday
call yesterdy.bat
echo GET RLP_CAUSER_0128_%Yesterday%.csv >ydout.dat
copy ftp1dat.txt + ydout.dat + ftp2dat.txt DatenHolen.ftp
goto aend


:getfriday
call dateadd -3
echo Letzter Freitag war: %DATEADD%
REM bei Deutschem Windows benutze jj mm tt
REM bei Englischem Windows benutze yy mm dd
REM in der naechsten Zeile
call datefmt2 jj mm tt /LZ %DATEADD%

REM die letzte Variable hier ist DateFmt die das korrigierte Datum enthaelt
echo GET RLP_CAUSER_0128_%DateFmt%.csv >ydout.dat
copy ftp1dat.txt + ydout.dat + ftp2dat.txt DatenHolen.ftp

:aend
ftp -s:DatenHolen.ftp
EXIT

Hier noch paar Erklaerungen:
call datepart.bat w
liefert den Wochentag in Numerischer Form
1 ist Montag, 2 ist Dienstag usw.
Um das Script Heute (Donnerstag) zu testen, ob das Datum von vor 3 Tagen genommen wird, in der nachfolgenden Zeile
if "%DatePart%"=="1" GOTO getfriday
die 1 durch eine 4 (fuer Donnerstag) ersetzen ...
Dann kommt nicht das Datum von Gestern (20130717) raus, sondern
20130718 minus 3 Tage = 15. Juli -> 20130715
Fuer die Produktiv Batch wieder auf
if "%DatePart%"=="1" GOTO getfriday
setzen

call dateadd -3
zieht vom heutigen Datum 3 Tage ab
und liefert das Ergebnis in der Variablen DATEADD
Diese Variable uebergeben wir der naechsten Batch, der angepassten DATEFMT.BAT => jetzt DATEFMT2.BAT
so das der gesamte Aufruf lautet:
call datefmt2 jj mm tt /LZ %DATEADD%

Der Parameter /LZ bedeutet hier nur ... auffuellen mit fuehrenden Nullen
(Leading Zero's)

Das neu formatierte Datum nehmen wir nun, wie schon in der urspruenglichen T1.BAT, um einen Datenschnipsel fuer die FTP Script Datei zu erstellen.
Diese Zeile enthaelt nun wieder eine angepasste FTP Download Zeile mit variablem Dateinamen, der Datei die mittels FTP heruntergeladen werden soll.
Dateiname ist nun angepasst fuer den Fall das wir Montag haben, mit Datum vom letzten Freitag face-smile

regards, uli face-wink
bastla
bastla 18.07.2013 um 14:43:06 Uhr
Goto Top
@ Dieter
Sollte Zeile 25 nicht eher
If Weekday(dDate) = vbSunday Then
lauten?

Grüße
bastla
76109
76109 18.07.2013 aktualisiert um 14:57:52 Uhr
Goto Top
Hallo bastla!

Oha, stimmtface-smile Danke für den Hinweis (oben geändert)face-wink

Gruß Dieter
Biber
Biber 18.07.2013 aktualisiert um 20:08:48 Uhr
Goto Top
[OT] @bastla und @76109,

...ich will jetzt nicht rumchaotisieren in diesem Thread, aber ich hab mich früher ja auch mal kurz mit Batch und Datumswerten und wie komme ich heute auf das Datum von gestern rumgebalgt.

Ich würde die ganze Strategie (falls ich eventuell auf native Batch zurückfallen muss) umbauen:

  • beim Start der Batches das Datum des letzten geglückten Laufs aus einer Datei lesen lassen mit
Set /p letzterLauf=<%temp%\LetzterLauf.txt
  • den Batch nach dem Download in eine einzeilige Textdatei mit
>%temp%\LetzterLauf.txt @echo %Date%
schreiben lassen

Dann habe ich keine Umrechnerei mit 500+x Zeilen und drei Hilfsdateien und ich brauche mir um Sonderlocken keine Gedanken machen wie den Fall "Ostern"
(Ostern geht es dreifach schief. Karfreitag wird nicht gearbeitet, deshalb bleibt die Datei von Donnerstag liegen. Montag geht es auch schief, weil a) keine Datei von Karfreitag da ist b) keiner arbeitet und Dienstag fasst er nochmal ins Leere, weil keine Datei von Ostermontag da ist).

Mit meiner Mimik oben würde an Donnerstag vor Ostern die Datei vom Vortag geholt und am nächsten Arbeitstag (Dienstag) die Datei vom vorangegangenen Donnerstag.
Ohne ein O- bzw. Ge-stern berechnen zu müssen.

Grüße
Biber
P.S. Ach ja: vor dem Eintüten des Batches in den Taskplaner ist tatsächlich einmalig nötig, diese "LetzterLauf.txt"-Datei mit dem Datum von gestern manuell zu erzeugen.
Halte ich aber für vertretbar.

P.P.S. Statt echo %date% =>, z.B "18.07.2013" geht natürlich auch
echo %date:~-4,4%%date:~-7,2%%date:~-10,2% => "20130718".
[/OT]
76109
76109 18.07.2013 um 15:59:18 Uhr
Goto Top
Hallo Biber!

Gedanken machen wie den Fall "Ostern" (Ostern geht es dreifach schief. Karfreitag wird nicht gearbeitet, deshalb bleibt die Datei von Donnesrtag liegen. Montag geht es auch schief, weil a) keine Datei von Karfreitag da ist b) keiner arbeitet und Dienstag fasst er nochmal ins Leere, weil keine Datei von Ostermontag da ist).
Da hab ich mir natürlich auch meine Gedanken drüber gemacht, aber leider nix dazu eingefallenface-sad

Mit meiner Mimik oben würde an Donnerstag vor Ostern die Datei vom Vortag geholt und am nächsten Arbeitstag (Dienstag) die Datei vom vorangegangenen Donnerstag. Ohne ein O- bzw. Gestern berechnen zu müssen.
Super Ideeface-smile
Also, vor dem nächsten Download einmalig das gestrige Datum speichern und dann immer:
Datum auslesen, downloaden, aktuelles Datum speichern...

Das ich da nicht draufgekommen bin...face-sad

Gruß Dieter
u60u60
u60u60 18.07.2013 um 16:09:27 Uhr
Goto Top
Zitat von @76109:

> Mit meiner Mimik oben würde an Donnerstag vor Ostern die Datei vom Vortag geholt und am nächsten Arbeitstag
(Dienstag) die Datei vom vorangegangenen Donnerstag. Ohne ein O- bzw. Gestern berechnen zu müssen.
Super Ideeface-smile

Das ich da nicht draufgekommen bin...face-sad

da biste nich alleine :D

Gruß Dieter

regards, uli face-smile
bastla
bastla 18.07.2013 um 18:30:55 Uhr
Goto Top
@ Biber
Wer kann, der kann. face-smile

Grüße
bastla
Tristement
Tristement 01.08.2013 um 19:19:20 Uhr
Goto Top
Zitat von @Biber:
[OT] @bastla und @76109,

...ich will jetzt nicht rumchaotisieren in diesem Thread, aber ich hab mich früher ja auch mal kurz mit Batch und
Datumswerten und wie komme ich heute auf das Datum von gestern rumgebalgt.

Ich würde die ganze Strategie (falls ich eventuell auf native Batch zurückfallen muss) umbauen:

  • beim Start der Batches das Datum des letzten geglückten Laufs aus einer Datei lesen lassen mit
Set /p letzterLauf=<%temp%\LetzterLauf.txt
  • den Batch nach dem Download in eine einzeilige Textdatei mit
>%temp%\LetzterLauf.txt @echo %Date%
schreiben lassen

Dann habe ich keine Umrechnerei mit 500+x Zeilen und drei Hilfsdateien und ich brauche mir um Sonderlocken keine Gedanken machen
wie den Fall "Ostern"
(Ostern geht es dreifach schief. Karfreitag wird nicht gearbeitet, deshalb bleibt die Datei von Donnerstag liegen. Montag geht es
auch schief, weil a) keine Datei von Karfreitag da ist b) keiner arbeitet und Dienstag fasst er nochmal ins Leere, weil keine
Datei von Ostermontag da ist).

Mit meiner Mimik oben würde an Donnerstag vor Ostern die Datei vom Vortag geholt und am nächsten Arbeitstag (Dienstag)
die Datei vom vorangegangenen Donnerstag.
Ohne ein O- bzw. Ge-stern berechnen zu müssen.

Grüße
Biber
P.S. Ach ja: vor dem Eintüten des Batches in den Taskplaner ist tatsächlich einmalig nötig, diese
"LetzterLauf.txt"-Datei mit dem Datum von gestern manuell zu erzeugen.
Halte ich aber für vertretbar.

P.P.S. Statt echo %date% =>, z.B "18.07.2013" geht natürlich auch
echo %date:~-4,4%%date:~-7,2%%date:~-10,2% => "20130718".
[/OT]

So da bin ich wieder frisch aus dem Urlaub face-smile

Ich habe nun etliche mahle versucht etwas vernünftiges zum Laufen zu bekommen aber außer die Vorschläge von u60u60 funktioniert der Rest leider nicht face-sad
Bei dem Aufbau von u60u60 wird zwar herunter geladen aber das CMD Fenster bleibt offen da iwo wohl ein doppelter Aufruf stattfindet!?
Im CMD Fenster steht mehrmals das ich mit dem Server schon verbunden bin und mich abmelden solle da ich schon verbunden bin mit dem Server.

@Biber, dein Vorschlag klingt für mich recht plausibel und vor allem sicher da gerade wie du schon erwähnst bei Feiertagen das ganze ein wenig heikel wird. Kannst du das ganze ein wenig genauer erläutern für nen Newby wie mich
Biber
Biber 01.08.2013 aktualisiert um 20:28:31 Uhr
Goto Top
Moin Tristement,

na ja, was davon soll ich denn noch ausführlicher erklären....?

Ich gehe von zwei Voraussetzungen (ITler sagen eigentlich "Unterstellungen" oder "ungesicherte Annahmen" dazu) aus.

1) du brauchst diesen abgeleiteten Datumsstring "20130801" oder ähnlich nicht zum Rechnen oder Datum-Prüfen, sondern nur Teil des Dateinamens, Ist halt nur Text, der aber möglichst das Erstellungsdatum der Datei auf dem Server wiedergeben sollte,

2) Für dich und deine Kumpels mit dem Server gelten die gleichen Arbeits- & Feiertage.

Annahme 2 lässt dann folgendes schlussfolgern.
-> Heute ist Donnerstag, kein Feiertag, du hockst am Rechner -> also sitzen deine FTP-Kumpels auch am Rechner
-> für heute erzeugte Dateien auf der FTP-Seite brauchst du morgen (wenn du du die Datei herunterlädst) den ANSI-Datumsstring "20130801" für den 1.August 2013, das heutige Datum
-> den kannst du heute problemlos mit Batchmitteln erzeugen
echo %date:~-4,4%%date:~-7,2%%date:~-10,2% => "20130801".
-> aber verwenden darfst du den String erst morgen, wenn du deren Datei von heute saugst.


Deshalb die Idee: schreib dieses %date%-Gestrunkele HEUTE in eine Datei, merk dir deren Namen & Pfad und verwende den Inhalt morgen in deinem Batch.

Mit dem "SET /p LetzterLauf=<D:\ein\Merkname\von\Eben\Datumsstring.txt" kannst du die erste Zeile einer Textdatei in eine Variable einlesen.

Mit dem "echo %date:~-4,4%%date:~-7,2%%date:~-10,2%>D:\ein\Merkname\von\Eben\Datumsstring.txt kannst du in diese Datei immer das aktuelle Datum schreiben und jedweden bisherigen Inhalt überschreiben.

Jetzt musst du nur noch diese Variable "LetzterLauf" in deinem Schnipsel benutzen.

Grüße
Biber

P.S. Ich hoffe, du hast deinen Urlaub genossen, während wir hier ein paar hundert Codezeilen für dich zusammengeklöppelt haben? face-wink