(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
в скобки что-то похожее .
Затем я индексирую в массив из двух элементов логическое сравнение, которое будет объединено для 0
for $false
или 1
for $true
. В сравнении, я присваивание $d
на [datetime]
объект , созданный с момента чтения из текущей строки в файле. Этот объект сравнивается с тем $n
, который при первом запуске еще не был назначен, поэтому он никогда не будет соответствовать и $c
будет инициализирован 1
, так как присваивается значение индексации $c
.
Далее $n
заполняется следующей ожидаемой датой, добавляя 1
к текущему объекту datetime. Ключ здесь в том, что 1D
это [decimal]
буквально. По какой-то причине, когда вы добавляете целые числа к a [datetime]
, это интерпретируется как тики, но когда вы добавляете числа с плавающей запятой, они интерпретируются как дни. Так что это заполняется $n
для следующей итерации.
В результате счетчик сбрасывается каждый раз, когда текущая дата не совпадает со «следующей» датой (т.е. предыдущей датой плюс 1 день).
Наконец сообщение выводится.