(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
)で1 行ずつ読み取り、パイプスルーGet-Unique
(gu
)してから、パイプスルーForEach-Object
(%
)します。
ループで0
は、最初の要素の値と2番目の要素の$c
(+1
)の現在の値で2要素配列を作成します。を使用++$c
すると、次のようなラッピングを回避できます$c+1
、カッコ内のます。
次に、ブール比較を使用して2つの要素の配列にインデックスを付けます。これにより、0
for $false
または1
forに結合され$true
ます。比較内で、ファイルの現在の行から読み取られた日付から作成され$d
た[datetime]
オブジェクトに割り当てています。そのオブジェクトはと比較さ$n
れ、最初の実行ではまだ割り当てられていないため、インデックス付けの値がに割り当てられているため、一致することはなく、$c
に初期化1
され$c
ます。
次に、現在の日時オブジェクトに$n
追加1
することにより、次に予想される日付が入力されます。ここで重要なのは、1D
それが[decimal]
リテラルであることを意味します。何らかの理由で整数をaに追加する[datetime]
と、ティックとして解釈されますが、浮動小数点数を追加すると、それらは日として解釈されます。これが移入します$n
は次の反復のためにれます。
その結果、現在の日付が「次の」日付(前の日付に1日を加えた日付)に一致しないたびに、カウンターがリセットされます。
最後にメッセージが出力されます。