(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$c1$cตั้งแต่ค่าของดัชนีจะถูกมอบหมายให้
ถัดไป$nจะเติมด้วยวันที่คาดหวังถัดไปโดยการเพิ่ม1วัตถุวันที่และเวลาปัจจุบัน กุญแจนี่คือนั่น1Dหมายความว่ามันเป็น[decimal]ตัวอักษร ด้วยเหตุผลบางอย่างเมื่อคุณเพิ่มตัวเลขจำนวนเต็มลงใน a [datetime]มันถูกตีความว่าเป็นเห็บ แต่เมื่อคุณเพิ่มหมายเลขจุดลอยตัวพวกเขาจะถูกตีความว่าเป็นวัน ดังนั้นสิ่งนี้จะเติม$nสำหรับการทำซ้ำครั้งถัดไป
ผลกระทบคือตัวนับได้รับการรีเซ็ตทุกครั้งที่วันที่ปัจจุบันไม่ตรงกับวันที่ "ถัดไป" (ซึ่งเป็นวันที่ก่อนหน้านี้บวก 1 วัน)
ในที่สุดข้อความก็จะถูกส่งออก