(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), труби через Get-Unique( gu) , так як там може бути кілька записів з однієї і тієї ж дати, то труба через ForEach-Object( %).
У циклі я створюю масив 2 елементів зі значенням 0у першому елементі та поточним значенням $c( +1) у другому елементі. Використання ++$cдозволяє мені уникати загортання чогось подібного $c+1до дужок.
Потім я індексую в масив двох елементів з булевим порівнянням, яке буде зв'язано 0для $falseабо 1для $true. У порівнянні, я присвоювання $dна [datetime]об'єкт , створений з моменту читання з поточного рядка в файлі. Цей об'єкт порівнюється з тим $n, якому під час першого запуску ще не було призначено, тому він ніколи не збігатиметься та $cбуде ініціалізований 1, оскільки значення індексації призначено $c.
Далі $nзаповнюється наступна очікувана дата шляхом додавання 1до поточного об'єкта date date . Ключовим тут є те, що 1Dце [decimal]буквально. Чомусь, коли ви додаєте цілі числа до а [datetime], це трактується як галочки, але коли ви додаєте числа з плаваючою комою, вони інтерпретуються як дні. Отже, це заповнюється $nдля наступної ітерації.
Ефект полягає в тому, що лічильник перезавантажується кожного разу, коли поточна дата не відповідає даті «наступної» (що є попередньою датою плюс 1 день).
Нарешті повідомлення виводиться.