macabre
Goto Top

Aktuelles Datum in eine Textdatei einlesen, davon die Jahreszahl ermitteln und in einer Batchdatei damit weiterarbeiten

Oje oje, der Titel ist so lang wie mein Wissen über Batch kurz; also, das Problem ist Folgendes: Ich lasse mit Hilfe der Date /t Funktion ein Datum in eine Textdatei schreiben. Von diesem Datum möchte ich allerdings nur die letzten 4 Zeichen, sprich die Jahreszahl haben. Warum? Mittels einer Batchdatei soll überprüft werden, ob das Datum ungleich der Jahreszahl "2006" ist. Ist es also nicht "2006", soll das Programm mit goto [Textmarke] fortgesetzt werden, ist es 2006, soll es mit Exit beendet werden.

Da ich wirklich kaum etwas von Batchprogrammierung verstehe und ich mich erst gestern an das Problem gewagt habe, hoffe ich dass man mir da ein wenig weiterhelfen kann face-smile Von daher kann ich auch kaum etwas an Code beisteuern (zumindest nichts brauchbares).

Das System mit dem ich arbeite ist XP, die Datei die ausgelesen werden soll, trägt den namen datum.txt und kann irgendwo erstellt werden (Bsp. C:\bla\datum.txt), man sollte sie nur wieder finden. ;)

Wäre euch dankbar wenn ihr mir helfen könntet face-smile


EDIT: Erster Ansatz:

@echo off
@echo Test des Datums

rem aktuelles Datum speichern, Umleitung in Datei
date /t>J:\datum.txt

rem Jahreszahl ermitteln
@for %%i in (J:\datum.txt) do set last4=%%i
@set last4=%last4:~-4%
pause

rem Exit bei 2006
if last4=="2006" goto ende
echo Jahr ist nicht 2006, Programm wird forgesetzt.
pause
del J:\datum.txt
exit

:ende
echo Programm wird abgebrochen.
del J:\datum.txt
pause
exit

Allerdings gibt das Programm immer nur "Jahr ist nicht 2006, Programm wird fortgesetzt" aus, auch wenn ich in die Textdatei manipulativ eine "2006" schreibe und die Zeile "date /t>J:\datum.txt" auskommentiere. Ich weiß nich mehr weiter. :/

EDIT2: Zweiter Ansatz, erste Lösung.

Da leider niemand helfen konnte hab ich es letztendlich doch anders gemacht als geplant. Da der Code ursprünglich dafür genutzt werden sollte zu kontrollieren, dass ein bereits fertiges Programm nur noch in diesem Jahr, sprich 2005, gestartet werden kann (weil: nächstes Jahr gibts ein Neues ;), habe ich einfach alle möglichen Datumsangaben von heute bis zum 31.12.2005 in eine Textdatei geschrieben und lass mit folgendem Programm das heutige Datum in dieser textdatei suchen:

@echo off
@echo Test des Datums

rem Variable setzen
set heute=%date%

rem Untersuchung ob Systemdatum zu den zulässigen Daten gehört
findstr %heute% J:\zuldatum.txt>ergebnis &&goto weiter
echo Programm wird abgebrochen.
pause
exit

:weiter
echo Jahr ist nicht 2006, Programm wird forgesetzt.
pause

exit


Die Lösung ist nicht die schönste, aber ich wollte das Thema nicht unbeantwortet hier stehen lassen. Wer dennoch weiß und mir sagen kann was man im ersten Versuch hätte besser machen können, der kann das ja trotzdem noch posten. face-smile

Content-Key: 21522

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

Printed on: April 16, 2024 at 12:04 o'clock

Member: Biber
Biber Dec 13, 2005 at 12:18:38 (UTC)
Goto Top
Hm, macabre,

ich würde die wesentliche Prüfung (ob richtige Jahreszahl in der Textdatei ist) in einer Zeile abfackeln.


~~~
Herleitung:
In der FOR /F-Schleife zerlege ich das aktuelle Datum und unterstelle, dass die Jahreszahl am Ende steht und die Datumstrenner "/" oder "." sind. Das Datum kann also im Format "Di, 13.12.2005" oder "13/12/2005" kommen... das dritte Token davon ist immer die Jahreszahl 2005. (Also immer natürlich nicht, aber 85% Trefferquote habe ich. Für 98,7% siehe TutIII in "Batch und Shell")
Mit "Find" prüfe ich, ob "2005" in der Textdatei enthalten ist.

HTH Biber
Member: Macabre
Macabre Dec 13, 2005 at 19:26:32 (UTC)
Goto Top
Vielen vielen Dank Biber! face-smile

Also auf sowas wäre ich ja nie gekommen... und ist auch viel komfortabler und effizienter als alle Daten in die txt manuell einzugeben und prüfen zu lassen. Aber wie gesagt ich mach das erst seit gestern. face-smile Programm wurde also nochmal geändert und läuft jetzt auch ohne vorgefertigte txt. Nochmals Danke, Biber!
Member: Biber
Biber Dec 13, 2005 at 22:51:23 (UTC)
Goto Top
Gern geschehen, macabre,

Du kannst Dich ja an irgendwelchen verregneten Vorweihnachtstagen ein bisschen durch die Tutorials im Bereich "Batch & Shell" quälen - ein paar Kniffe stehen da schon drin, auf die man/frau sonst weder beim ersten noch beim dritten oder siebten Mal kommt.
Und dann fängt nämlich das Level an, wo selbst bätchen anfängt Spaß zu machen.

Schönen Abend Dir
Frank / der Biber aus Bremen
Member: f.e.dorr
f.e.dorr Dec 13, 2005 at 23:01:18 (UTC)
Goto Top
hallo herr BIBER!

könnten sie bitte noch einem verzweifelten datumd-uhrzeitverwender weiterhelfen?

ich sitze jetzt seit stunden dran, einen dos-batch zu erstellen, der eine datei mit fixem namen auf dateinamen-datum-zeit.txt umbenennt, hab auch schon einiges aus ihrer trickkiste probiert, scheiter beim kopieren aber immer an leerstellen im dateinamen, z.b. hinter derm monat, tag, der stunde ....

das ist doch sicher sooo simpel....

könnten sie mir bitte einen tipp geben???

vielen dank

dorr2@afflerbach.de

friedrich.e.dorr
Member: Biber
Biber Dec 14, 2005 at 00:14:09 (UTC)
Goto Top
@f.e.dorr
Moin, der Herr, face-wink

klar kann ich das, aber..
a) nicht um diese Uhrzeit - da schlaf ich eigentlich immer schon...
b) nicht ohne ein paar Anhaltspunkte:
Was gibts schon an "Gerüst" vom Batch??.. kann ja auch Pseudocode sein..
Wie soll das gewünschte Ziel aussehen ("2005-12-13_alterdateiname.xyz" oder "Di 13.12.2005 alterdateiname 23h39.xyz"...oder oder oder..
c) und nur in diesem Thread, wenn es hier auch reinpasst - sonst bitte einen neuen aufmachen.

Und Sie dürfen ruhig Du zu mir sagen (immer noch besser als "das da", wie meine Ex-Schwiegermutter immer gesagt hat..) ;- )

Grüße Biber
P.S. Der Vorab-Tipp: Dateinamen, die Leerzeichen beinhalten, müssen in Anführungszeichen eingeschlossen werden. Beispiel: copy "c:\Dokumente und Einstellungen\*.txt" d:temp

P.P.S. Darf aber nichts zu Komplexes sein, habe heute abend Weihnachtsfeier, da muss ich pünktlich sein.
Member: f.e.dorr
f.e.dorr Dec 14, 2005 at 11:20:46 (UTC)
Goto Top
hallo 'BIBER'!
super, das du mir helfen wirst face-smile
ich glaube, das skript, das du jetzt siehst ist ganz genau deines ... hab nur schon stundenlang vergeblich versucht, mir eine zeichenkette wie "jjjmmtt-hhmmss" zusammenzubauen, um ganz simpel über einen batch eine datei zu weg-zukopieren mit irgendeiner form von datum und uhrzeit, gerne auch mit sekunde ... die reihenfolge ist nicht so wichtig ....
hier dass (ihrige) skript ...

::-------snipp GetAllDateTimeInfos.bat -----
@echo on & setlocal
:: (c) Biberware 2005 Placed in the Public Domain Oct 2005 for Educational Purposes
:: Ermittelt Datums/Zeitvariable aus dem CMD-Environment und stellt sie als Variablen bereit.
:: Einschränkung: Sollte schon NT oder höher sein. Deshalb die nächte Zeile

[...(gekürzt)........ siehe Batch-TutIII im Bereich "Batch & Shell"]

IF not defined YY goto YYskip
IF %YY% LSS 39 set YY=20%YY%
IF %YY% LEQ 99 set YY=19%YY%
:YYskip
If not defined JJ goto JJskip
IF %JJ% LSS 39 set JJ=20%JJ%
IF %JJ% LEQ 99 set JJ=19%JJ%
:JJskip

IF defined YY set JJ=%YY%
IF defined JJ set YY=%JJ%
IF defined DD Set TT=%DD%
IF defined TT Set DD=%TT%
:: Lass sehen, was wir haben....falls kein Parameter /q
For %%i in (%1 %2 %3 %4) Do If /i %%i==/q goto cleanUp

For %%i in (INDate INTime %AllDateTimeVars%) do @if defined %%i set %%i

:::pause
::: echo.| date /T | LMOD Updated: [$4], [$5] [-] >> some.log
:::pause
::: echo.| time /T | LMOD at [$3]>> some.log
pause

:::echo on
:::FOR /F "tokens=1-10 delims=:/.-, " %%i in ("%MM% %TT% %hh%") do set dorr=%MM%%TT%%hh%
:::echo dorr

:::FOR /F "tokens=1-10 delims= " %%i in ("%dorr%") do set dorr2=%dorr%
:::echo dorr2
:::pause

echo on
::::dorr2 = strip$(shiftl$(%JJ%-%DoW%-%cDow%-%TT%_%hh%$%min%))
::::echo dorr2

:::copy sdclog sdclog-%JJ%-%MM%-%TT%_%hh%$%min%.bak
copy sdclog sdclog-%JJ%-%DoW%-%cDow%-%TT%_%hh%$%min%.bak
:::hier ist mein problem,ich hab hinter einigen variablen LEERstellen, die eine
:::erzeugung eines dateinamens verhindern.
:::es wird erzeugt: copy sdclog sdclog-2005-348--14 _11 $02.bak
:::da bitte ich um hilfe, 'herr' BIBER !! herzlichen dank
pause

:cleanUp
For %%i in (vbssnippet INTime INDate) Do Set %%i=
goto :eof
[....(gekürzt)....... siehe Batch-TutIII im Bereich "Batch & Shell"]


::-------snapp GetAllDateTimeInfos.bat


so 20 zeilen höher hab ich mein problemchen beschrieben ...

wäre toll, sie könnten mir >BITTE< weiterhelfen!

vielen dank!

freue mich auch über eine mail an dorr2@afflerbach.de!
02684/84-333

mfg

friedrich
Member: Biber
Biber Dec 14, 2005 at 17:05:51 (UTC)
Goto Top
Soooooooo, friedrich,

dumm gelaufen bzw. da war ich zu schlampig...
Der Fehler liegt bei mir bzw. in folgenden Blöckchen:
...
IF not defined YY goto YYskip
IF %YY% LSS 39 set YY=20%YY%
IF %YY% LEQ 99 set YY=19%YY%
:YYskip
If not defined JJ goto JJskip
IF %JJ% LSS 39 set JJ=20%JJ%
IF %JJ% LEQ 99 set JJ=19%JJ%
:JJskip

IF defined YY set JJ=%YY%
IF defined JJ set YY=%JJ%
IF defined DD Set TT=%DD%
IF defined TT Set DD=%TT%
...

Da sollten, damit der Sinn auch nach dem Cut & Paste erhalten bleibt, alle "SET"-Anweisungen auch auf die immer von mir beschworene undokumentierte Art in Anführungszeichen gesetzt werden.
Also so:
IF not defined YY goto YYskip
IF %YY% LSS 39 set "YY=20%YY%"
IF %YY% LEQ 99 set "YY=19%YY%"
:YYskip
If not defined JJ goto JJskip
IF %JJ% LSS 39 set "JJ=20%JJ%"
IF %JJ% LEQ 99 set "JJ=19%JJ%"
:JJskip

IF defined YY set "JJ=%YY%"
IF defined JJ set "YY=%JJ%"
IF defined DD Set "TT=%DD%"
IF defined TT Set "DD=%TT%"

Das war das Problem. In meinem Original-Batch waren natürlich keine trailing blanks am Ende der "If defined"-Zeilen.
Beim Cut & Paste kommen aber offensichtlich wieder welche rein.

Ich schreibe auch einen ähnlichen Kommentar unter das Batch-Tutorial und korrigiere es dort.

@friedrich:

Nach dieser Korrektur sollte auch Deine Umbenennerei funktionieren so wie in den letzten Tut-Zeilen vorgeschlagen.
Also
a) den unveränderten Batch "GetAllDateTimeInfos.bat" mit Parameter /s /q ("in Ruhe setzen") aufrufen;
b) irgendwas umbenennen mit Nutzung der Variablen %TT%, %MM%, ... etc, die dann zur Verfügung stehen ohne Leerzeichen.
c) der Ordnung halber danach wieder "GetAllDateTimeInfos.bat" mit Parameter /u wie UNSET aufrufen.

Grüße nach Puderbach
Biber
P.S. Und wenn es dann noch klemmt, kurze pn an mich.
Member: f.e.dorr
f.e.dorr Dec 15, 2005 at 16:17:05 (UTC)
Goto Top
hallo 'BIBER'!

vielen, vielen dank! jetzt hab ich das kopieren/wegsichern DANK deiner hilfe am laufen!
SUPER!

viele grüße & frohes fest

friedrich
Member: Biber
Biber Dec 15, 2005 at 16:50:42 (UTC)
Goto Top
Gern geschehen, friedrich,

nur durch solche Rückmeldungen bekommen wir ja ja hier gemeinsam robustere Bätche/Skripte hin, und davon profitieren alle.

grübel ...schade, dass M$ die Fehlermeldungen bekommen hat..
sonst hätten die jetzt schon ein stabliles Betriebssystem...

Schönen Abend und *winks* in den Westerwald
Biber
P.S. @friedrich: Ich kürze mal Deinen ersten Kommentar auf die bug-haltigen Zeilen des GetAllDateTimeVars.bat. Denn sonst postet hier unter diesen Thread in zwei Monaten wieder einer: "Ich hab da mal ne Frage zu dem Skript.."