(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 0no primeiro elemento e o valor atual de $c( +1) no segundo elemento. Usar ++$cme 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 0for $falseou 1for $true. Na comparação, estou atribuindo a $dum [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 $cserá inicializado 1, pois o valor da indexação está sendo atribuído $c.
Em seguida, $né preenchido com a próxima data esperada, adicionando 1ao objeto de data e hora atual. A chave aqui é que 1Disso 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 $npara 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.