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