(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Hãy thử trực tuyến!
Giải trình
Tôi bắt đầu bằng cách viết ngày hiện tại (ở định dạng ngày ngắn) ra một tệp (có tên z). >>hoạt động như bình thường; nối thêm, nhưng tạo ra nếu nó không tồn tại.
Tiếp theo, tôi đọc nội dung của dòng tệp theo dòng với Get-Content( gc), pipe through Get-Unique( gu) vì có thể có nhiều mục từ cùng một ngày, sau đó chuyển qua ForEach-Object( %).
Trong vòng lặp, tôi tạo một mảng 2 phần tử với giá trị 0trong phần tử đầu tiên và giá trị hiện tại của $c( +1) trong phần tử thứ hai. Sử dụng ++$ccho phép tôi tránh gói một cái gì đó như $c+1trong ngoặc đơn.
Sau đó, tôi lập chỉ mục vào mảng hai phần tử với phép so sánh boolean, sẽ được kết hợp thành 0cho $falsehoặc 1cho $true. Trong phần so sánh, tôi đang gán cho $dmột [datetime]đối tượng được tạo từ ngày đọc từ dòng hiện tại trong tệp. Đối tượng đó được so sánh với $n, trong lần chạy đầu tiên chưa được chỉ định, vì vậy nó sẽ không bao giờ khớp và $csẽ được khởi tạo 1, vì giá trị của việc lập chỉ mục được gán cho $c.
Tiếp theo, $nđược điền với ngày dự kiến tiếp theo, bằng cách thêm 1vào đối tượng datetime hiện tại. Chìa khóa ở đây 1Dcó nghĩa là nó [decimal]theo nghĩa đen. Vì một số lý do khi bạn thêm số nguyên vào a [datetime], nó được hiểu là dấu tick, nhưng khi bạn thêm số dấu phẩy động, chúng được hiểu là ngày. Vì vậy, điều này cư trú $ncho lần lặp tiếp theo.
Hiệu quả là bộ đếm được đặt lại mỗi lần ngày hiện tại không khớp với ngày "tiếp theo" (là ngày trước đó cộng với 1 ngày).
Cuối cùng tin nhắn là đầu ra.