(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 दिन है) से मेल नहीं खाती है।
अंत में संदेश आउटपुट है।