(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 день).
Нарешті повідомлення виводиться.