(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Wypróbuj online!
Wyjaśnienie
Zaczynam od zapisania bieżącej daty (w formacie krótkiej daty) do pliku (o nazwie z). >>działa jak zwykle; dołącza, ale tworzy, jeśli nie istnieje.
Następnie czytam zawartość pliku linia po linii za pomocą Get-Content( gc), potok przez Get-Unique( gu), ponieważ może być wiele wpisów z tej samej daty, a następnie potok przez ForEach-Object( %).
W pętli tworzę tablicę 2-elementową z wartością 0w pierwszym elemencie i bieżącą wartością $c( +1) w drugim elemencie. Używanie ++$cpozwala mi uniknąć zawijania czegoś takiego jak $c+1w nawiasach.
Następnie indeksuję do tablicy dwuelementowej z porównaniem boolowskim, które zostanie połączone z 0for $falselub 1for $true. W ramach porównania, jestem przypisanie $ddo [datetime]obiektu utworzonego od daty odczytać z bieżącej linii w pliku. Obiekt ten jest porównywany do tego $n, który przy pierwszym uruchomieniu nie został jeszcze przypisany, więc nigdy nie będzie pasował i $czostanie zainicjowany 1, ponieważ przypisywana jest wartość indeksowania $c.
Następnie $nzapełni się następną oczekiwaną datą, dodając 1do bieżącego obiektu daty i godziny. Kluczem tutaj jest 1Dto, że jest to [decimal]dosłowne. Z jakiegoś powodu, gdy dodajesz liczby całkowite do a [datetime], jest to interpretowane jako tiki, ale kiedy dodajesz liczby zmiennoprzecinkowe, są one interpretowane jako dni. Wypełnia to $ndo następnej iteracji.
Skutkuje to tym, że licznik jest resetowany za każdym razem, gdy bieżąca data nie pasuje do „następnej” daty (czyli poprzedniej daty plus 1 dzień).
Wreszcie wiadomość jest wysyłana.