(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 0
nel primo elemento e il valore corrente di $c
( +1
) nel secondo elemento. L'uso ++$c
mi consente di evitare di avvolgere qualcosa di simile $c+1
tra parentesi.
Poi indice I in due serie di elementi con un confronto booleano, che andranno a coalescenza 0
per $false
o 1
per $true
. All'interno del confronto, sto assegnando a $d
un [datetime]
oggetto creato dalla data letta dalla riga corrente nel file. Quell'oggetto viene confrontato con il $n
quale alla prima esecuzione non è stato ancora assegnato, quindi non corrisponderà mai e $c
verrà inizializzato 1
, poiché il valore dell'indicizzazione viene assegnato a $c
.
Successivamente, $n
viene popolato con la data prevista successiva, aggiungendo 1
all'oggetto datetime corrente. La chiave qui è che 1D
significa 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 $n
per 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.