(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ą 0
w pierwszym elemencie i bieżącą wartością $c
( +1
) w drugim elemencie. Używanie ++$c
pozwala mi uniknąć zawijania czegoś takiego jak $c+1
w nawiasach.
Następnie indeksuję do tablicy dwuelementowej z porównaniem boolowskim, które zostanie połączone z 0
for $false
lub 1
for $true
. W ramach porównania, jestem przypisanie $d
do [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 $c
zostanie zainicjowany 1
, ponieważ przypisywana jest wartość indeksowania $c
.
Następnie $n
zapełni się następną oczekiwaną datą, dodając 1
do bieżącego obiektu daty i godziny. Kluczem tutaj jest 1D
to, ż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 $n
do 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.