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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 211533
Url: https://administrator.de/contentid/211533
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
29 Kommentare
Neuester Kommentar
Hallo Tristement,
Müsstest du also zu Fuss nachbauen, wenn es nicht schon mal jemand erledigt hätte
YESTERDAY.BAT
lg
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
YESTERDAY.BAT
lg
Hallo!
Hab als Nicht-Batcher auch mal was zusammengebastelt, bleib aber lieber bei VBS
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/weiterbasteln
Wobei in Codezeile 62 das Ausgabeformat nach belieben angepasst werden kann
Quelle: hier und hier
Hier noch ne Batch mit Hilfe von VBS:
Gruß Dieter
Hab als Nicht-Batcher auch mal was zusammengebastelt, bleib aber lieber bei VBS
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/weiterbasteln
@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
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
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
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
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
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
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
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
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 ^^
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
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
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 "
Grüße
bastla
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)
bastla
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 "
Grüße
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)
>
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
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!
)
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.
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.
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.
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
> 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?
>
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
> 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
>
> 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
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
> 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:
>
> 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
> 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
> (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?
> 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
> .................................................
> GET RLP_CAUSER_0128_20130715.csv
*TRISTEMENT* : Muss ich hier was machen oder geht das dann von alleine ?
>
> (datei 5) wird in t1.bat erstellt und hat nach Ausfuehrung nachfolgenden Inhalt
> morgen natuerlich eins weiter
> .................................................
> 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
Immer wieder sehe ich meine DatenHolen.ftp muss ich diese doch wieder anlegen und wenn ja was muss da rein?
> ---
>
> laeuft sowohl unter WinXP, alsauch Windows7
>
> sicherlich liesse sich das ganze noch mit pipes weiter vereinfachen
>
> regards, uli
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
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
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
Nun ist mir heute Nacht aber noch nen Problem eingefallen
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.
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
Nun ist mir heute Nacht aber noch nen Problem eingefallen
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.
Hier jetzt nochmal die optimierte Version die am Montag auf Freitag springt (sozusagen)
EDIT: Nochmal ne neue verkürzte Version.
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
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):
Grüße
bastla
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%"
bastla
Hallo @all!
Oder das Ganze gleich mit einem Script erledigen (*.vbs):
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
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
Zitat von @76109:
Hallo @all!
Oder das Ganze gleich mit einem Script erledigen (*.vbs):
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 @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
Hallo Invisan!
Sorry, hatte ich doch glatt übersehen und Du hast Dir ja reichlich Mühe gegeben
Kein Wunder bei diesen riesen Kommentaren verliert man leicht den Überblick...
Gruß Dieter
Sorry, hatte ich doch glatt übersehen und Du hast Dir ja reichlich Mühe gegeben
Kein Wunder bei diesen riesen Kommentaren verliert man leicht den Überblick...
Gruß Dieter
Zitat von @76109:
Hallo Invisan!
Sorry, hatte ich doch glatt übersehen und Du hast Dir ja reichlich Mühe gegeben
Kein Wunder bei diesen riesen Kommentaren verliert man leicht den Überblick...
Gruß Dieter
Hallo Invisan!
Sorry, hatte ich doch glatt übersehen und Du hast Dir ja reichlich Mühe gegeben
Kein Wunder bei diesen riesen Kommentaren verliert man leicht den Überblick...
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
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 ... 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
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
regards, uli
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 ... 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
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
regards, uli
Hallo bastla!
Oha, stimmt Danke für den Hinweis (oben geändert)
Gruß Dieter
Oha, stimmt Danke für den Hinweis (oben geändert)
Gruß Dieter
[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:
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
[/OT]
...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 auchecho %date:~-4,4%%date:~-7,2%%date:~-10,2%
=> "20130718".[/OT]
Hallo Biber!
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...
Gruß Dieter
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 eingefallenMit 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 IdeeAlso, 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...
Gruß Dieter
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 Idee
(Dienstag) die Datei vom vorangegangenen Donnerstag. Ohne ein O- bzw. Gestern berechnen zu müssen.
Super Idee
Das ich da nicht draufgekommen bin...
da biste nich alleine :D
Gruß Dieter
regards, uli
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
-> 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?
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?