(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
( %
)।
लूप में, मैं 0
पहले तत्व में मान के साथ 2 तत्व सरणी बनाता हूं , और दूसरे तत्व में $c
( +1
) का वर्तमान मूल्य । उपयोग ++$c
करने से मुझे $c+1
कोष्ठकों में कुछ लपेटने से बचने की अनुमति मिलती है।
फिर एक बूलियन तुलना है, जो करने के लिए एकत्रित हो जाएगी साथ दो तत्व सरणी में मैं सूचकांक 0
के लिए $false
या 1
के लिए $true
। तुलना के भीतर, मैं फ़ाइल में वर्तमान लाइन से पढ़ी गई तिथि से बनाई गई $d
किसी [datetime]
वस्तु को असाइन कर रहा हूं । उस ऑब्जेक्ट की तुलना में हो जाता है $n
, जिसे पहले रन के लिए अभी तक असाइन नहीं किया गया है, इसलिए यह कभी भी मेल नहीं खाएगा, और $c
इसे इनिशियलाइज़ किया जाएगा 1
, क्योंकि इंडेक्सिंग के मूल्य को सौंपा जा रहा है $c
।
इसके बाद, वर्तमान डेटाटाइम ऑब्जेक्ट में $n
जोड़कर, अगली अपेक्षित तिथि के साथ आबादी है 1
। यहाँ कुंजी यह है कि 1D
इसका अर्थ है एक [decimal]
शाब्दिक। किसी कारण से जब आप पूर्णांक संख्याओं को एक में जोड़ते हैं [datetime]
, तो इसे टिक्स के रूप में व्याख्या किया जाता है, लेकिन जब आप फ़्लोटिंग पॉइंट संख्या जोड़ते हैं, तो उन्हें दिनों के रूप में व्याख्या की जाती है। तो यह $n
अगले पुनरावृत्ति के लिए पॉप्युलेट करता है।
इसका प्रभाव यह है कि काउंटर को हर बार रीसेट किया जाता है जब वर्तमान तिथि "अगली" तारीख (जो कि पिछली तारीख से अधिक 1 दिन है) से मेल नहीं खाती है।
अंत में संदेश आउटपुट है।