(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Попробуйте онлайн!
объяснение
Я начинаю с записи текущей даты (в коротком формате даты) в файл (с именем z). >>работает как обычно; добавляет, но создает, если его не существует.
Затем я прочитал содержимое файла построчно с Get-Content( gc), pipe through Get-Unique( gu), так как может быть несколько записей от одной даты, затем pipe through ForEach-Object( %).
В цикле я создаю массив из 2 элементов со значением 0в первом элементе и текущим значением $c( +1) во втором элементе. Использование ++$cпозволяет мне не заключать $c+1в скобки что-то похожее .
Затем я индексирую в массив из двух элементов логическое сравнение, которое будет объединено для 0for $falseили 1for $true. В сравнении, я присваивание $dна [datetime]объект , созданный с момента чтения из текущей строки в файле. Этот объект сравнивается с тем $n, который при первом запуске еще не был назначен, поэтому он никогда не будет соответствовать и $cбудет инициализирован 1, так как присваивается значение индексации $c.
Далее $nзаполняется следующей ожидаемой датой, добавляя 1к текущему объекту datetime. Ключ здесь в том, что 1Dэто [decimal]буквально. По какой-то причине, когда вы добавляете целые числа к a [datetime], это интерпретируется как тики, но когда вы добавляете числа с плавающей запятой, они интерпретируются как дни. Так что это заполняется $nдля следующей итерации.
В результате счетчик сбрасывается каждый раз, когда текущая дата не совпадает со «следующей» датой (т.е. предыдущей датой плюс 1 день).
Наконец сообщение выводится.