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