(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 0dans le premier élément et la valeur actuelle de $c( +1) dans le deuxième élément. L'utilisation ++$cme 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 0pour $falseou 1pour $true. Dans la comparaison, j'assigne à $dun [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 $csera initialisé à 1, car la valeur de l'indexation est affectée à $c.
Ensuite, $nest rempli avec la prochaine date attendue, en ajoutant 1à l'objet datetime actuel. La clé ici est que 1Dcela 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.