(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Provalo online!
Spiegazione
Comincio scrivendo la data corrente (in formato data breve) in un file (denominato z). >>funziona come al solito; aggiunge, ma crea se non esiste.
Successivamente, ho letto il contenuto del file riga per riga con Get-Content( gc), pipe through Get-Unique( gu) poiché potrebbero esserci più voci dalla stessa data, quindi pipe through ForEach-Object( %).
Nel ciclo, creo un array di 2 elementi con il valore 0nel primo elemento e il valore corrente di $c( +1) nel secondo elemento. L'uso ++$cmi consente di evitare di avvolgere qualcosa di simile $c+1tra parentesi.
Poi indice I in due serie di elementi con un confronto booleano, che andranno a coalescenza 0per $falseo 1per $true. All'interno del confronto, sto assegnando a $dun [datetime]oggetto creato dalla data letta dalla riga corrente nel file. Quell'oggetto viene confrontato con il $nquale alla prima esecuzione non è stato ancora assegnato, quindi non corrisponderà mai e $cverrà inizializzato 1, poiché il valore dell'indicizzazione viene assegnato a $c.
Successivamente, $nviene popolato con la data prevista successiva, aggiungendo 1all'oggetto datetime corrente. La chiave qui è che 1Dsignifica che è [decimal]letterale. Per qualche motivo quando aggiungi numeri interi a [datetime], viene interpretato come tick, ma quando aggiungi numeri in virgola mobile, vengono interpretati come giorni. Quindi questo si popola $nper la prossima iterazione.
L'effetto è che il contatore viene resettato ogni volta che la data corrente non corrisponde alla data "successiva" (che è la data precedente più 1 giorno).
Alla fine viene emesso il messaggio.