(date -f 'd')>>z
gc z|gu|%{$c=(1,++$c)[($d=date $_)-eq$n]
$n=$d+1D}
"You have a $c day streak!"
Çevrimiçi deneyin!
açıklama
Geçerli tarihi (kısa tarih biçiminde) bir dosyaya (adlandırılmış z) yazarak başlıyorum . >>her zamanki gibi çalışır; ekler, ancak yoksa oluşturur.
Daha sonra, aynı tarihten birden fazla giriş olabileceğinden Get-Content( gc), pipe through Get-Unique( gu) ile dosyanın içeriğini satır satır okudum , ardından ForEach-Object(% ).
Döngüde, 0ilk öğedeki değeri ve ikinci öğedeki $c( +1) geçerli değerini içeren 2 öğeli bir dizi oluştururum . Kullanmak parantez ++$cgibi bir şey sarmaktan kaçınmamı sağlar $c+1.
Daha sonra 0için $falseveya 1için birleştirilecek bir boole karşılaştırması ile iki element dizisine indekslerim $true. Karşılaştırma içinde, dosyadaki geçerli satırdan okunan tarihten oluşturulan $dbir [datetime]nesneye ataıyorum . Bu nesne $n, ilk çalıştırmada henüz atanmamış olan ile karşılaştırılır , bu nedenle dizinleme değerinin atandığı için hiçbir zaman eşleşmez ve $csıfırlanır .1$c
Ardından, geçerli datetime nesnesine $neklenerek bir sonraki beklenen tarihle doldurulur 1. Buradaki anahtar, bunun gerçek 1Dbir [decimal]kelime olduğu anlamına geliyor . Bazı nedenlerden dolayı, a'ya tamsayı sayıları eklediğinizde [datetime], keneler olarak yorumlanır, ancak kayan nokta sayıları eklediğinizde, bunlar gün olarak yorumlanır. Bu $n, bir sonraki yineleme için doldurulur .
Etkisi, sayacın geçerli tarih "sonraki" tarihle her eşleşmediğinde (önceki tarih artı 1 gün) sıfırlanmasıdır.
Sonunda mesaj çıktı.