doschtinator
Goto Top

Datum mittels batch vergleichen und Zeilen löschen oder nichts tun

Bitte erneut um kurze Hilfe face-smile

Hallo an alle,

ich habe eine termine.txt-Datei, die z.B. folgende Inhalte hat:


25.10.2011 8:00Uhr
Termin mit Gruppe A


26.10.2011 8:00Uhr
Treffen der Sicherheitsbeauftragten


25.11.2011 12:00Uhr
Feueralarm im Haupthaus

usw.


Ich möchte nun mit einer Batch-Datei jeweils immer die erste Zeile der termine.txt-Datei auslesen und damit das Datum erhalten. Also:

: begin of batch
set /p Datum=<termine.txt
Echo %Datum:~,10% -> Liefert mir zumindest das oberste Datum in der termine.txt


Jetzt soll in der Batch das Datum mit dem aktuellen Datum verglichen werden.
Liegt der Termin in der Zukunft oder ist es der gleiche Tag, soll nichts passieren und die termine.txt bleibt unverändert.
Liegt der Termin in der Vergangenheit, so sollen die ersten fünf Zeilen der termine.txt gelöscht werden.
Leider hänge ich genau an diesen beiden Punkten. Also wie vergleiche ich die Datumsangaben und wie lösche ich die ersten fünf Zeilen?

Toll wäre zusätzlich, wenn die Abfrage nicht nur einmal ausgeführt wird. Schließlich kann es ja mal sein, dass ein Tag mehrere Termine hat!
Daher so lange ausführen / wiederholen, bis ein Datum aus der Zukunft in der ersten Zeile steht.
Wäre quasi das Sahnehäubchen face-wink

Vielen Dank für jede Hilfe schon im Voraus!

Grüße

doschtinator

Content-ID: 176305

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

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

60730
60730 15.11.2011 um 18:30:45 Uhr
Goto Top
Moin,

Also - wenn du das wirklich brauchst, dann stellt sich mir die frage, hast du schon mal des Bibers tut zum Thema Batch und Datum gelesen?

Offensichtlich nein.
Zum anderen Thema, wie lösche ich eine bestimmte Anzahl Zeilen, da Verweise ich auf x Beiträge, wo das gezeigt wurde.
Die haben auch alle einen aussagefähigen Titel, unter dem die gefunden werden.

Und so toll ist deine Anfrage nun auch nicht, dass sich das wiederkäuen und schreiben für einen Bachelor rentiert.
Denn das ist zu anspruchslos und bereits so oder ähnlich hier zu finden, wenn man suchen würde.

Da kann man sich kein Erfolgserlebnis holen.

Also... Werf die suche an
doschtinator
doschtinator 15.11.2011 um 18:35:05 Uhr
Goto Top
Tut mir leid dass ich zu doof bin, aber ich könnte jetzt hier auch diverse Links hinterlassen, unter denen ich mich versucht habe zu informieren. Leider ohne Erfolg!
Wenn du es schon schreibst, dann würden mich zumindest zwei passende Links vielleicht weiterbringen.

Gruß

doschtinator
60730
60730 15.11.2011 um 18:41:17 Uhr
Goto Top
Nein...

Ich geb dir einen Tipp Biber Tutorial -lässt sich finden....

Irgendwas mit more +5 Zeilen löschen Batch, sollte auch zu finden sein...

Gb dir etwas mühe Mensch...

Helfen und veredeln ja abschreiben und einen Gutenberg aus bastla Biber und Co. Das macht genausowenig Spaß, wie dauernd die faulen Eier anzumahnen - denn der Geruch färbt dann nur auf einen ab.

Das einzig interessante an der Nummer ist das mit den evtl. Doppelten Einträgen pro Tag....
Aber auch das findest du das heutige Datum nicht, lass die Batch in Ruhe, findest du es Lauf durch.
Ist wirklich nicht sehr anspruchsvoll die Nummer...

Gruss

Ps wegen doof, die Marktlücke ist doch schon von Verona katzenberger ausgefüllt....
pieh-ejdsch
pieh-ejdsch 15.11.2011 um 19:30:20 Uhr
Goto Top
moin,

Ich würde das Angesprochene Tut ZeitVariablen nicht dafür Benutzten (nicht weil es nicht Erforderlich wäre - sondern eine andere Lösung weniger Kompliziert ist - der Weg darüber ist aber nicht Verkehrt).

Ungetetstet !!
setlocal
set "input=D:\Termine.txt"  
findstr /n "^" "%input%" > "%temp%\tmp"  
set  /a RevDate=%date:~-4%%date:~-7,2%%date:~-10,2%

set Output=3^> "D:\TermineX.txt"  

(
for /f "usebackq tokens=1,* delims=:" %%i in ("%temp%\tmp") do (for /f "tokens=1-3 delims=. " %%k in ("%%j") do if %RevDate% geq %%m%%l%%k set "Ok=5"  
  if defined OK ( >&3 echo(%%j
    set /a ok=ok-1,test=1/ok 2>nul||set "ok="  
)  )
) %Output%

[Edit] if Vergleich angepasst [Edit]
Gruß Phil
Biber
Biber 15.11.2011 um 19:37:57 Uhr
Goto Top
Moin doschtinator,

ich kann zu der von T-Mo ja bereits gelieferten Bastelanleitung noch einen proof-of-concept-Oneliner liefern, der bei mir am CMD-Prompt das richtige Ergebnis unter drei Annahmen liefert:
  • das mir durch die [systemeigene] Umgebungsvariable %date% angezeigte Datum ist im Format TT.MM.JJJJ
  • delayedExpansion ist bei mir immer aktiviert
  • in deiner Termine.txt sind auch alle Einträge nach aufsteigendem Datum angeordnet.

Dann erhalte ich beim Test am CMD-Prompt (Anm: ich habe "mode con cols=233 lines=55" vorweg abgefeuert) :
d:\temp>for /f "delims=. tokens=1-3" %a in ("%date%") do @for /f "tokens=1-4 delims=:. " %i in ('findstr /n "$" termine.txt^|findstr /r "\.2011"') do @if %l GEQ %c IF %k GEQ %b if %j GEQ %a set /a "zz=%i-1" & more termine.txt +!zz!

25.11.2011 12:00Uhr
Feueralarm im Haupthaus

...versuchte Strategie-Erklärung

... for /f "delims=. tokens=1-3" %a in ("%date%") do ....
-> So fange ich an: ich zerlege das Datum in TT.MM.JJJJ in drei Tokens %a für TTag, %b für MMonat und %c für JJJJahr

..... for /f "tokens=1-4 delims=:. " %i in ('findstr /n "$" termine.txt^|findstr /r "\.2011"') do ....
-> mit dem ersten Findstr nummeriere ich alle Zeilen (incl Leerzeilen) der Termine.txt, mit dem zweiten Findstr hole ich alle Zeilen mit ".2011" davon

...... if %l GEQ %c IF %k GEQ %b if %j GEQ %a
-> wenn in diesen Zeilen gegeben ist JahrInDerZeile Größergleich JJJJHeute und MonatInderZeile größergleich MMHeute Und Tag...auch...
[Edit: zur Verdeutlichung hier dieser Zwischenschritt ]
d:\temp>for /f "delims=. tokens=1-3" %a in ("%date%") do @for /f "tokens=1-4 delims=:. " %i in ('findstr /n "$" termine.txt^|findstr /r "\.2011"') do @echo if %l GEQ %c IF %k GEQ %b if %j GEQ %a more termine.txt +(%i-1)
if 2011 GEQ 2011 IF 10 GEQ 11 if 25 GEQ 15 more termine.txt +(1-1)
if 2011 GEQ 2011 IF 10 GEQ 11 if 26 GEQ 15 more termine.txt +(6-1)
if 2011 GEQ 2011 IF 11 GEQ 11 if 25 GEQ 15 more termine.txt +(11-1)
[/Edit]

... set /a "zz=%i-1"
--> dann setze die neu ausgedachte Variable zz auf den Wert "Zeilennummer in der Termine.txt minus 1"


... & more termine.txt +!zz!
und gib Termine.txt ab dieser Zeile aus (am besten natürlich in eine neue Datei AktuelleTermine.txt umleiten)

Ergebnis:

25.11.2011 12:00Uhr
Feueralarm im Haupthaus
(Folgezeilen)

Anmerkung: Ist ja nur proof-of-concept.
In einer Batch-Lösung muss natürlich das weitere Durchflöhen der Termine.txt nach der ersten Fundstelle "Termin>=Heute" unterbunden werden.
Der Oneliner klappt quasi nur richtig, wenn nur ein Termin >=Heute vorliegt.

Grüße
Biber

[Edit II]

Die Jahr/Monat/Tag-Vergleichsmimik ist, wie mir eben erst aufgefallen ist, etwas unsinnig.
Wenn z.b das Jahr in der Termine.txt schön größer ist als das heutige Jahr--> dann braucht natürlich nicht auch der Monat Größergleich dem heutigen Monat sein und der Tag erst recht nicht.

Sollte ja nur eine Skizze werden....
[/Edit ii]
60730
60730 15.11.2011 um 20:33:57 Uhr
Goto Top
Moin junxxs,

Ich will euch ja nicht enttäuschen, aber das ist doch killefitz...

Jemand, der die Suchmaschine nicht bedienen kann oder will, der hat mit dem pietschteil natürlich sein Ziel erreicht.
Meister Biber erklärbares ja wenigstens noch.

Und dabei ist das ganze noch viel einfacher:

Finde das aktuelle Datum und wenn ja, merke dir die zeilennummer und schreib via more eine temp. Datei.
Um 00.01 läuft ein at Job, der eine bestehende tmp Datei zum original move d.

Gibt's keine gibt's auch nix zu tun, aber das war ja eh das gesteckte Ziel vom machmanator.

Ich werd zu alt für sowas.
doschtinator
doschtinator 15.11.2011 um 20:43:11 Uhr
Goto Top
Hallo an alle,

Danke an pieh-ejdsch und Biber!

Beim Test des Vorschlags von pieh-ejdsch hatte ich leider keinen Erfolg. Trotzdem Danke!

Der Vorschlag von Biber übersteigt definitiv mein Niveau! Sorry, aber da muss ich passen! Würde den Code gerne verstehen, aber da habe ich keine Chance face-smile
Sicherlich war mein Tag auch etwas zu lang, aber meine Batch-Kenntnisse sind weniger als rudimentär!

Auch der Test von Bibers Lösung hat nicht den gewünschten Erfolg. Es wird die Textdatei geöffnet und im Anschluss taucht im cmd-Fenster ein Teil des Inhalts mit der Meldung -- Fortsetzung (100%) -- auf
Hat vielleicht was mit 'delayedExpansion ist bei mir immer aktiviert' zu tun. Keine Ahnung was das ist.

Die Strategie-Erklärung leuchtet mir bis zu den if-Abfragen ein, aber danach mit den Zeilennummern?
Ich hätte da eine Schleife genommen, die das ganze so lange durchführt, bis in der ersten Zeile ein aktuelles bzw. zukünftiges Datum steht.

Einfach gesagt, aber wie erwähnt, ich steige beim Syntax leider nicht durch und habe auch keine Ahnung davon.

Werde mich wohl nach einer alternativen Lösung umsehen müssen.

Trotzdem Danke!

Gruß

doschtinator

Nachtrag an TimoBeil:

Deinen letzten Beitrag hättest du mir auch als erste Antwort präsentieren können. Denn das dies mit batch möglich ist und auch eine Lösungsmöglichkeit darstellt, war mir bis soeben gänzlich unbekannt und hatte ich daher auch nicht in Betracht gezogen! Scheinbar geht es und es hört sich auch logisch an, allerdings habe ich keine Ahnung wie ich dies syntaktisch umsetzen muss. Werde wohl oder übel suchen müssen.
Daher wende ich mich an ein Forum, da meine Ideen und mein "Wissen" ausgeschöpft sind - nicht weil ich fertige Lösungen erwarte! Aber scheinbar gibt es Personen, die hier mit ihrem Wissen einen Hilfesuchenden mit der vermeintlichen Einfachheit überzeugen wollen, die nicht gegeben ist.
Nicht falsch verstehen TimoBeil, du hast mir auch schon sehr geholfen! Warum dies heute aber so seltsam verlaufen ist, ist mir schleierhaft.
pieh-ejdsch
pieh-ejdsch 15.11.2011 um 20:45:15 Uhr
Goto Top
moin Timo,

ich schrub doch "Ungetestet"
die Suchmaschine nicht bedienen kann oder will, der hat mit dem pietschteil ...
nicht Doch. Wollte auch ein bissel zu selbstanregen Anregen.
bei den Zeilen mit ---- oder : oder was sonst noch vor der 0 ist würde der Output ein bissel unerwünscht sein.
Die Initiative kommt dann in Zeile 09 bei/mit gtr und etwas mit: if und lss und 0 und %date:~-4% müsste noch dazu.

Gruß Phil
pieh-ejdsch
pieh-ejdsch 15.11.2011 um 21:11:20 Uhr
Goto Top
Der Vorschlag von Biber übersteigt definitiv mein Niveau! Sorry, aber da muss ich passen! Würde den Code gerne verstehen, aber da habe ich keine Chance Sicherlich war mein Tag auch etwas zu lang, aber meine Batch-Kenntnisse sind weniger als rudimentär!

... aber das ist doch killefitz...
[OT]
ich hatte mich mit Batch erst befasst, als ich meine Fotosammlung wegen "Nicht in Irgend einer Software Herumklickarie" arrangieren wollte.
Erst hatte ich selbst mit paar zusammengesuchten schnippseln von Administrator.de von Biber, bastla, LotPing usw. versucht zu verstehen was da genau geschieht und ich hatte Null Ahnung.
Ich wusste nicht warum der Batch einmal Funktionierte und einmal nicht.
Bis ich Begann die CMD-Hilfe und Bibers Runaways zu lesen.ein halbes Jahr später dann.
Dann machte es Plötzlich Klick und ich begriff das ganze Variablen-Zeugs. Und weil ich mich beim begreifen so schwer getan hatte - machte ich ne Anleitung , die ich nach meinem Wissenstand begreifen würde.
Ich tu mich heute noch damit schwer einen Kurzen Batch zu schreiben. Ich mache zuviele Umwege wo einiges leichter geht weil ich nicht die komplette Referenz gelesen/ behalten hab.

Aber Nachlesen hilft auch schon viel
[OT]

So nichtsdestotrotz ...
... die Angepasste Zeile 09
for /f "usebackq tokens=1,* delims=:" %%i in ("%temp%\tmp") do (for /f "tokens=1-3 delims=. " %%k in ("%%j") do if %%m equ %date:~-4% if %RevDate%  lss %%m%%l%%k set "Ok=5"   

Gruß Phil
Biber
Biber 15.11.2011 um 21:46:41 Uhr
Goto Top
Moin doschtinator,

auch ich wollte dir keinen out-of-the-box-Fertig-Schnipsel vor die Füsse werfen, weil ich ähnlich wie pieh-ejdsch der festen Überzeugung bin, du musst EINMAL das Prinzip wirklich verstanden haben, dann ist der knoten geplatzt.
Fertiglösungen stehen da eher im Weg - auch, weil es ja keine Notwendigkeit zur gedanklichen Auseinandersetzung mit irgendeinem unappetitlich aussehenden Gestrunkele gibt, wenn es denn einfach funktioniert.

Deshalb lass auch bei meiner Skizze alles weg, was sich irgendwann schnell ersuchmaschinen lässt (Delayed expansion und ähnliche Albernheiten).
Mir ging es um die Strategie, um das "Wie bewege ich mich in dieser fremden Welt?" und das "Wie kann ich das Problem zerlegen?"

Dein Ansatz liest sich schön auf einer abstrakten Ebene...
Liegt der Termin in der Zukunft oder ist es der gleiche Tag, soll nichts passieren und die termine.txt bleibt unverändert.
Liegt der Termin in der Vergangenheit, so sollen die ersten fünf Zeilen der termine.txt gelöscht werden.
Leider hänge ich genau an diesen beiden Punkten. Also wie vergleiche ich die Datumsangaben und wie lösche ich die ersten fünf Zeilen?

Geht aber so nicht in der Batch/CMD-Welt, weil ...
  • Im Batch nur für Masochisten und Stoiker ein Datumsvergleich überhaupt zumutbar ist.
  • im Batch eine Vorgehensweise "Ich bin in einer Datei, dann lösch ich darin die ersten 5 Zeilen und springe wieder zum Dateianfang" auch nicht gerade gerade das ist, was Bildhauer als "Eingehen auf die Gegebenheiten von Material und Werkzeug" bezeichnen.

Gib nicht gleich auf mit "Werde mich wohl nach einer alternativen Lösung umsehen müssen."

Grüße
Biber
16568
16568 16.11.2011 um 01:14:15 Uhr
Goto Top
| OT |

Zitat von @Biber:
...
irgendeinem unappetitlich aussehenden Gestrunkele gibt, wenn es denn einfach funktioniert.
...

Ja ja, aber bei mir über Analogien Witze reißen... :-P
| / OT |


Lonesome Walker
60730
60730 16.11.2011 um 09:22:39 Uhr
Goto Top
Moin,

Zitat von @doschtinator:
Jetzt soll in der Batch das Datum mit dem aktuellen Datum verglichen werden.
Soweit so gut
Liegt der Termin in der Zukunft oder ist es der gleiche Tag, soll nichts passieren und die termine.txt bleibt unverändert.
Und da ist der erste Denkfehler, der - wenn die Daten in einer Reihenfolge stehen - das ganze nur komplizierter macht.
Liegt der Termin in der Vergangenheit, so sollen die ersten fünf Zeilen der termine.txt gelöscht werden.
Mit Batch Datum, ist immer fies tricksen, und das hättest du im tut vom Biber finden können.
Wenn du die Strategie so umstellst, dass nach dem aktuellen datum gesucht wird und du dir dessen zeilennummer merkst
Und dann - auch das ist "normal" - zu der gefundenen zeilennummer x addierst, hast du doch den Rest, der in der Zukunft ist
In einer temporären Datei.
Und je nachdem, wann das Script laeuft, machst du das mit dem zurückschreiben der temp. Datei ins original sofort oder später
Leider hänge ich genau an diesen beiden Punkten. Also wie vergleiche ich die Datumsangaben und wie lösche ich die ersten fünf Zeilen?
Und genau solche Zeilen, bringen mich auf Hochtouren, wenn du eine ahnung hättest, mit was sich der eine oder andere plagen muss...
Vielen Dank für jede Hilfe schon im Voraus!
Ich hab dir geholfen, von Anfang an.
Ganz ehrlich und nicht nur auf dich, diesen thread bezogen...
Manchmal denke ich, andere denken - Batch kostet nix, daher mach ichs damit.
(Und weil Batch nix kostet und ich ne flatrate habe, Outsource ich die Entwicklung des gewünschten Werkzeugs.)
Dabei ist es wie mit jedem anderen programmierwerkzeug - die Planung der Schritte ist der Ansatz und wenn ich die zusammen hab, dann erst weiß ich, welches Werkzeug ich dazu nehme.

Gruß

PS:
Und von wegen Kopf in den Sand......wenn du das machst, dann beweist du mir doch nur, das ich recht hatte - und ich wuerde mich gerne irren