(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Probieren Sie es online!
Erläuterung
Ich beginne damit, das aktuelle Datum (im kurzen Datumsformat) in eine Datei (mit Namen z) zu schreiben . >>funktioniert wie gewohnt; wird angehängt, aber erstellt, wenn es nicht vorhanden ist.
Als nächstes lese ich den Inhalt der Datei Zeile für Zeile mit Get-Content( gc), Pipe Through Get-Unique( gu), da es mehrere Einträge vom selben Datum geben kann, und dann Pipe Through ForEach-Object( %).
In der Schleife erstelle ich ein Array mit 2 Elementen mit dem Wert 0im ersten Element und dem aktuellen Wert von $c( +1) im zweiten Element. Mit ++$ckann ich vermeiden, etwas $c+1in Klammern zu setzen.
Dann indexiere ich in das Array mit zwei Elementen mit einem booleschen Vergleich, der zu 0for $falseoder 1for verschmolzen wird $true. Innerhalb des Vergleichs ordne ich $dein [datetime]Objekt zu, das aus dem Datum erstellt wurde, das aus der aktuellen Zeile in der Datei gelesen wurde. Dieses Objekt wird mit verglichen $n, das beim ersten Durchlauf noch nicht zugewiesen wurde. Daher wird es nie mit dem Objekt übereinstimmen und $cmit initialisiert 1, da der Wert der Indizierung zugewiesen wird $c.
Als nächstes $nwird mit dem nächsten erwarteten Datum 1aufgefüllt , indem zum aktuellen datetime-Objekt hinzugefügt wird. Der Schlüssel hier ist, dass 1Des ein [decimal]Literal ist. Wenn Sie a Ganzzahlen hinzufügen [datetime], wird dies aus irgendeinem Grund als Häkchen interpretiert. Wenn Sie jedoch Gleitkommazahlen hinzufügen, werden diese als Tage interpretiert. Das füllt sich also $nfür die nächste Iteration.
Dies hat zur Folge, dass der Zähler jedes Mal zurückgesetzt wird, wenn das aktuelle Datum nicht mit dem "nächsten" Datum (dem vorherigen Datum plus 1 Tag) übereinstimmt.
Schließlich wird die Nachricht ausgegeben.