(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Experimente online!
Explicação
Começo escrevendo a data atual (em formato de data abreviada) em um arquivo (nomeado z
).>>
funciona como de costume; acrescenta, mas cria se não existir.
Em seguida, leio o conteúdo do arquivo linha por linha com Get-Content
( gc
), canalize através Get-Unique
( gu
), pois pode haver várias entradas a partir da mesma data, e canalize ForEach-Object
(%
).
No loop, crio uma matriz de 2 elementos com o valor 0
no primeiro elemento e o valor atual de $c
( +1
) no segundo elemento. Usar ++$c
me permite evitar envolver algo como$c+1
parênteses.
Então eu indexo na matriz de dois elementos com uma comparação booleana, que será coalescida para 0
for $false
ou 1
for $true
. Na comparação, estou atribuindo a $d
um [datetime]
objeto criado a partir da data lida na linha atual no arquivo. Esse objeto é comparado a $n
, o qual, na primeira execução, ainda não foi atribuído, portanto, nunca corresponderá e $c
será inicializado 1
, pois o valor da indexação está sendo atribuído $c
.
Em seguida, $n
é preenchido com a próxima data esperada, adicionando 1
ao objeto de data e hora atual. A chave aqui é que 1D
isso significa que é [decimal]
literal. Por alguma razão, quando você adiciona números inteiros a [datetime]
, ele é interpretado como ticks, mas quando você adiciona números de ponto flutuante, eles são interpretados como dias. Portanto, isso é preenchido $n
para a próxima iteração.
O efeito é que o contador é redefinido toda vez que a data atual não coincide com a "próxima" data (que é a data anterior mais 1 dia).
Finalmente, a mensagem é enviada.