(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Essayez-le en ligne!
Explication
Je commence par écrire la date actuelle (au format de date courte) dans un fichier (nommé z
).>>
fonctionne comme d'habitude; s'ajoute, mais crée s'il n'existe pas.
Ensuite, je lis le contenu du fichier ligne par ligne avec Get-Content
( gc
), pipe through Get-Unique
( gu
) car il peut y avoir plusieurs entrées à partir de la même date, puis pipe through ForEach-Object
(%
).
Dans la boucle, je crée un tableau à 2 éléments avec la valeur 0
dans le premier élément et la valeur actuelle de $c
( +1
) dans le deuxième élément. L'utilisation ++$c
me permet d'éviter d'envelopper quelque chose comme$c+1
entre parenthèses.
Ensuite, je indexe dans le tableau à deux éléments avec une comparaison booléenne, qui sera fusionnée en 0
pour $false
ou 1
pour $true
. Dans la comparaison, j'assigne à $d
un [datetime]
objet créé à partir de la date lue à partir de la ligne actuelle dans le fichier. Cet objet est comparé à $n
, qui lors de la première exécution n'a pas encore été attribué, il ne correspondra donc jamais et $c
sera initialisé à 1
, car la valeur de l'indexation est affectée à $c
.
Ensuite, $n
est rempli avec la prochaine date attendue, en ajoutant 1
à l'objet datetime actuel. La clé ici est que 1D
cela signifie que c'est un [decimal]
littéral. Pour une raison quelconque, lorsque vous ajoutez des nombres entiers à a [datetime]
, il est interprété comme des graduations, mais lorsque vous ajoutez des nombres à virgule flottante, ils sont interprétés comme des jours. Donc, cela remplit$n
pour la prochaine itération.
L'effet est que le compteur est réinitialisé à chaque fois que la date actuelle ne correspond pas à la date "suivante" (qui est la date précédente plus 1 jour).
Enfin, le message est sorti.