(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Pruébalo en línea!
Explicación
Comienzo escribiendo la fecha actual (en formato de fecha corta) en un archivo (llamado z).>>funciona como de costumbre; agrega, pero crea si no existe.
A continuación, leo el contenido del archivo línea por línea con Get-Content( gc), canalizo a través de Get-Unique( gu) ya que podría haber múltiples entradas desde la misma fecha, luego canalizo a través de ForEach-Object(% ).
En el bucle, creo una matriz de 2 elementos con el valor 0en el primer elemento y el valor actual de $c( +1) en el segundo elemento. Usar ++$cme permite evitar envolver algo como$c+1 entre paréntesis.
Luego indexo en la matriz de dos elementos con una comparación booleana, que se fusionará para 0para $falseo 1para $true. Dentro de la comparación, estoy asignando a $dun [datetime]objeto creado a partir de la fecha de lectura de la línea actual en el archivo. Ese objeto se compara con $n, que en la primera ejecución aún no se ha asignado, por lo que nunca coincidirá y $cse inicializará 1, ya que se está asignando el valor de la indexación $c.
A continuación, $nse completa con la siguiente fecha esperada, agregando 1al objeto datetime actual. La clave aquí es que 1Dsignifica que es un [decimal]literal. Por alguna razón, cuando agrega números enteros a [datetime], se interpreta como ticks, pero cuando agrega números de coma flotante, se interpretan como días. Entonces esto se completa $npara la próxima iteración.
El efecto es que el contador se reinicia cada vez que la fecha actual no coincide con la fecha "siguiente" (que es la fecha anterior más 1 día).
Finalmente se emite el mensaje.