(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 0
en el primer elemento y el valor actual de $c
( +1
) en el segundo elemento. Usar ++$c
me 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 0
para $false
o 1
para $true
. Dentro de la comparación, estoy asignando a $d
un [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 $c
se inicializará 1
, ya que se está asignando el valor de la indexación $c
.
A continuación, $n
se completa con la siguiente fecha esperada, agregando 1
al objeto datetime actual. La clave aquí es que 1D
significa 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 $n
para 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.