<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Automation on kenji.blog</title><link>http://kenji.blog/hi/tags/automation/</link><description>Recent content in Automation on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 06:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/tags/automation/index.xml" rel="self" type="application/rss+xml"/><item><title>PowerShell स्क्रिप्ट्स के साथ दैनिक कार्यों को पूरी तरह से स्वचालित करने का व्यावहारिक उदाहरण</title><link>http://kenji.blog/hi/p/powershell-daily-task-automation-scripts/</link><pubDate>Sun, 13 Sep 2026 06:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/powershell-daily-task-automation-scripts/</guid><description>&lt;img src="http://kenji.blog/p/powershell-daily-task-automation-scripts/img/eyecatch.jpg" alt="Featured image of post PowerShell स्क्रिप्ट्स के साथ दैनिक कार्यों को पूरी तरह से स्वचालित करने का व्यावहारिक उदाहरण" />&lt;h2 id="परचय-करय-क-सवचलत-करन-क-लए-powershell-क-उपयग-कय-कर">परिचय: कार्यों को स्वचालित करने के लिए PowerShell का उपयोग क्यों करें?
&lt;/h2>&lt;p>आधुनिक IT इन्फ्रास्ट्रक्चर और विकास परिवेश में, Windows OS का उपयोग करने वाले उपयोगकर्ताओं के लिए &amp;ldquo;दैनिक नियमित कार्य&amp;rdquo; एक अपरिहार्य चुनौती है। फाइलों का बैकअप लेना, सिस्टम लॉग की निगरानी करना, और विकास संसाधनों (Git रिपॉजिटरी) को अपडेट और बिल्ड करना—इन कार्यों को मैन्युअल रूप से करने से मानवीय त्रुटियों की संभावना बढ़ती है और बहुमूल्य समय बर्बाद होता है।&lt;/p>
&lt;p>अतीत में, बैच फाइलों (&lt;code>.bat&lt;/code> या &lt;code>.cmd&lt;/code>) और VBScript का उपयोग किया जाता था, लेकिन आज सबसे अच्छा समाधान निस्संदेह &lt;strong>PowerShell&lt;/strong> है। PowerShell केवल एक टेक्स्ट-आधारित शेल नहीं है, बल्कि यह .NET Framework (और .NET Core) की शक्तिशाली ऑब्जेक्ट-ओरिएंटेड नींव पर बनाया गया है। क्योंकि पाइपलाइन के माध्यम से पारित डेटा &amp;ldquo;स्ट्रिंग&amp;rdquo; नहीं बल्कि &amp;ldquo;ऑब्जेक्ट&amp;rdquo; होता है, आपको जटिल टेक्स्ट पार्सिंग (जैसे grep, awk, sed) को खुद लागू करने की आवश्यकता नहीं होती है, और आप केवल गुण (properties) निर्दिष्ट करके आसानी से डेटा तक पहुंच सकते हैं।&lt;/p>
&lt;p>इस लेख में, हम PowerShell का उपयोग करके व्यावहारिक कार्यों के लिए 3 पूरी तरह से स्वचालित स्क्रिप्ट्स के उदाहरण पेश करेंगे (NAS पर बैकअप और लॉग रोटेशन, इवेंट लॉग मॉनिटरिंग और Slack नोटिफिकेशन, और कई Git रिपॉजिटरी के बैच अपडेट/बिल्ड)। इसके अतिरिक्त, हम PowerShell निष्पादन नीतियों (execution policy), मॉड्यूलरकरण, और टास्क शेड्यूलर एकीकरण जैसी मूलभूत तकनीकों के बारे में भी गहराई से चर्चा करेंगे, जो इसके लिए आवश्यक हैं।&lt;/p>
&lt;hr>
&lt;h2 id="powershell-सवचलन-automation-क-नव-तयर-करन">PowerShell स्वचालन (Automation) की नींव तैयार करना
&lt;/h2>&lt;p>स्वचालित स्क्रिप्ट्स को उत्पादन (production) वातावरण में सुरक्षित और मज़बूती से काम करने के लिए कुछ प्रारंभिक तैयारियों की आवश्यकता होती है। यहाँ हम निष्पादन नीतियों को समझने, पुनः उपयोगिता (reusability) बढ़ाने के लिए मॉड्यूलरकरण, और मज़बूत एरर हैंडलिंग (error handling) के बारे में विस्तार से बताएंगे।&lt;/p>
&lt;h3 id="1-powershell-क-नषपदन-नत-execution-policy">1. PowerShell की निष्पादन नीति (Execution Policy)
&lt;/h3>&lt;p>Windows में, डिफ़ॉल्ट रूप से दुर्भावनापूर्ण स्क्रिप्ट्स को गलती से निष्पादित होने से रोकने के लिए &amp;ldquo;निष्पादन नीति (Execution Policy)&amp;rdquo; सेट की गई है। प्रारंभिक अवस्था (&lt;code>Restricted&lt;/code>) में, किसी भी स्क्रिप्ट (&lt;code>.ps1&lt;/code> फ़ाइल) को निष्पादित नहीं किया जा सकता है। स्वचालन के लिए, इसे उचित स्तर पर बदलना आवश्यक है।&lt;/p>
&lt;p>निष्पादन नीतियों के प्रकार निम्नलिखित हैं:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Restricted&lt;/strong>: किसी भी स्क्रिप्ट के निष्पादन की अनुमति नहीं देता है। (डिफ़ॉल्ट)&lt;/li>
&lt;li>&lt;strong>AllSigned&lt;/strong>: केवल विश्वसनीय प्रकाशकों द्वारा हस्ताक्षरित (signed) स्क्रिप्ट्स को चलाने की अनुमति देता है।&lt;/li>
&lt;li>&lt;strong>RemoteSigned&lt;/strong>: स्थानीय रूप से (locally) बनाई गई स्क्रिप्ट्स को सीधे चलाया जा सकता है, लेकिन इंटरनेट से डाउनलोड की गई स्क्रिप्ट्स के लिए हस्ताक्षर आवश्यक हैं।&lt;/li>
&lt;li>&lt;strong>Unrestricted&lt;/strong>: सभी स्क्रिप्ट्स को चलाया जा सकता है, लेकिन इंटरनेट से डाउनलोड की गई स्क्रिप्ट चलाते समय एक चेतावनी दिखाई जाएगी।&lt;/li>
&lt;li>&lt;strong>Bypass&lt;/strong>: कुछ भी ब्लॉक नहीं किया जाता है और कोई चेतावनी नहीं दिखाई जाती है। इसका उपयोग अक्सर अस्थायी स्क्रिप्ट निष्पादन (जैसे CI/CD पाइपलाइन) के लिए किया जाता है।&lt;/li>
&lt;/ul>
&lt;p>यदि आप किसी कॉर्पोरेट स्थानीय वातावरण में टास्क शेड्यूलर के साथ अपनी खुद की स्क्रिप्ट चला रहे हैं, तो सबसे व्यावहारिक और सुरक्षित सेटिंग &lt;code>RemoteSigned&lt;/code> है। व्यवस्थापक (Administrator) विशेषाधिकारों के साथ PowerShell शुरू करें और निम्नलिखित कमांड चलाएँ:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-ExecutionPolicy&lt;/span> &lt;span class="n">RemoteSigned&lt;/span> &lt;span class="n">-Scope&lt;/span> &lt;span class="n">LocalMachine&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यह सुनिश्चित करेगा कि स्थानीय रूप से बनाई गई बैकअप स्क्रिप्ट आदि बिना ब्लॉक हुए सुचारू रूप से चलें।&lt;/p>
&lt;h3 id="2-मडयलरकरण-क-मधयम-स-कड-क-पन-उपयग-psm1--psd1">2. मॉड्यूलरकरण के माध्यम से कोड का पुन: उपयोग (.psm1 / .psd1)
&lt;/h3>&lt;p>जटिल स्वचालन (automation) कार्यों के लिए, मेंटेनेबिलिटी (maintainability) के दृष्टिकोण से सभी प्रक्रियाओं को एक ही विशाल &lt;code>.ps1&lt;/code> फ़ाइल में लिखना अनुशंसित नहीं है। अक्सर उपयोग किए जाने वाले कार्यों (उदाहरण के लिए, लॉग आउटपुट, Slack पर Webhook भेजना, एरर हैंडलिंग आदि) को &amp;ldquo;मॉड्यूल&amp;rdquo; के रूप में विभाजित किया जाना चाहिए।&lt;/p>
&lt;p>PowerShell मॉड्यूल में मुख्य रूप से एक स्क्रिप्ट मॉड्यूल फ़ाइल (&lt;code>.psm1&lt;/code>) और एक मॉड्यूल मेनिफेस्ट (&lt;code>.psd1&lt;/code>) होता है।&lt;/p>
&lt;p>&lt;strong>CommonUtils.psm1&lt;/strong> का उदाहरण:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">Write-CustomLog&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="nb">CmdletBinding&lt;/span>&lt;span class="p">()]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">param&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="nb">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="na">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="vm">$true&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="no">string&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="nv">$Message&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="nb">ValidateSet&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;INFO&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;WARNING&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;ERROR&amp;#39;&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="no">string&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="nv">$Level&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;INFO&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$timestamp&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Date&lt;/span> &lt;span class="n">-Format&lt;/span> &lt;span class="s2">&amp;#34;yyyy-MM-dd HH:mm:ss&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$logLine&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;[&lt;/span>&lt;span class="nv">$timestamp&lt;/span>&lt;span class="s2">] [&lt;/span>&lt;span class="nv">$Level&lt;/span>&lt;span class="s2">] &lt;/span>&lt;span class="nv">$Message&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># स्क्रीन पर और फ़ाइल दोनों में आउटपुट&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="nv">$logLine&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Add-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\logs\automation.log&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="nv">$logLine&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Export-ModuleMember&lt;/span> &lt;span class="n">-Function&lt;/span> &lt;span class="nb">Write-CustomLog&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस मॉड्यूल को अन्य स्क्रिप्ट्स से कॉल करने के लिए, स्क्रिप्ट की शुरुआत में &lt;code>Import-Module&lt;/code> का उपयोग करें:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Import-Module&lt;/span> &lt;span class="s2">&amp;#34;C:\Scripts\Modules\CommonUtils.psm1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-CustomLog&lt;/span> &lt;span class="n">-Message&lt;/span> &lt;span class="s2">&amp;#34;बैकअप प्रक्रिया शुरू हो रही है।&amp;#34;&lt;/span> &lt;span class="n">-Level&lt;/span> &lt;span class="s1">&amp;#39;INFO&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="3-मजबत-एरर-हडलग-try--catch">3. मज़बूत एरर हैंडलिंग (try / catch)
&lt;/h3>&lt;p>स्वचालन में सबसे महत्वपूर्ण बात यह है कि &amp;ldquo;विफल होने पर क्या करना है&amp;rdquo;। PowerShell में, आप अंतर्निहित चर (built-in variable) &lt;code>$ErrorActionPreference&lt;/code> सेट करके कमांड के विफल होने पर डिफ़ॉल्ट व्यवहार को नियंत्रित कर सकते हैं। डिफ़ॉल्ट &lt;code>Continue&lt;/code> (त्रुटि प्रदर्शित करें और जारी रखें) है, लेकिन स्वचालित स्क्रिप्ट्स के लिए इसे &lt;code>Stop&lt;/code> पर सेट करना और स्पष्ट रूप से अपवादों (exceptions) को पकड़ने के लिए &lt;code>try / catch&lt;/code> ब्लॉक का उपयोग करना सर्वोत्तम अभ्यास है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$ErrorActionPreference&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;Stop&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># ऐसी प्रक्रिया जो विफल हो सकती है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$content&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\NonExistentFile.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">System.Management.Automation.ItemNotFoundException&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># विशिष्ट त्रुटि को पकड़ना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;फ़ाइल नहीं मिली: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Exception&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Message&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="n">-ForegroundColor&lt;/span> &lt;span class="n">Red&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># अन्य सभी त्रुटियों को पकड़ना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;अप्रत्याशित त्रुटि उत्पन्न हुई: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Exception&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Message&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="n">-ForegroundColor&lt;/span> &lt;span class="n">Red&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">finally&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># क्लीनअप प्रक्रिया जो सफलता या विफलता की परवाह किए बिना हमेशा निष्पादित होती है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;प्रक्रिया समाप्त हो रही है।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस आधार का लाभ उठाकर, आप ऐसी स्क्रिप्ट बना सकते हैं जो रात में बिना किसी निगरानी के चलने पर भी सुरक्षित और ट्रैक करने योग्य (trackable) हों।&lt;/p>
&lt;hr>
&lt;h2 id="टसक-शडयलर-क-सथ-एककरण-register-scheduledtask">टास्क शेड्यूलर के साथ एकीकरण (Register-ScheduledTask)
&lt;/h2>&lt;p>एक बार स्क्रिप्ट पूरी हो जाने के बाद, आपको इसे नियमित रूप से चलाने के लिए एक तंत्र की आवश्यकता होती है। Windows में सबसे विश्वसनीय तरीका &amp;ldquo;टास्क शेड्यूलर&amp;rdquo; है। यद्यपि इसे GUI (&lt;code>taskschd.msc&lt;/code>) से कॉन्फ़िगर किया जा सकता है, इन्फ्रास्ट्रक्चर प्रक्रियाओं (Infrastructure as Code) को कोड करने के दृष्टिकोण से, हम PowerShell कमांडलेट का उपयोग करके कार्यों को पंजीकृत करने का तरीका समझाएंगे।&lt;/p>
&lt;p>PowerShell में &lt;code>ScheduledTasks&lt;/code> मॉड्यूल शामिल है, जो आपको ट्रिगर (कब निष्पादित करना है), क्रिया (क्या निष्पादित करना है), और प्रिंसिपल (किस उपयोगकर्ता विशेषाधिकार के साथ निष्पादित करना है) को विस्तार से परिभाषित करने की अनुमति देता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. क्रिया की परिभाषा (PowerShell को छिपा कर चलाना और निर्दिष्ट स्क्रिप्ट पास करना)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$action&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-ScheduledTaskAction&lt;/span> &lt;span class="n">-Execute&lt;/span> &lt;span class="s2">&amp;#34;powershell.exe&amp;#34;&lt;/span> &lt;span class="n">-Argument&lt;/span> &lt;span class="s2">&amp;#34;-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\Scripts\DailyTasks.ps1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. ट्रिगर की परिभाषा (प्रतिदिन सुबह 3:00 बजे निष्पादित करें)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$trigger&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-ScheduledTaskTrigger&lt;/span> &lt;span class="n">-Daily&lt;/span> &lt;span class="n">-At&lt;/span> &lt;span class="s2">&amp;#34;3:00AM&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. प्रिंसिपल (निष्पादन उपयोगकर्ता विशेषाधिकार) की परिभाषा (SYSTEM विशेषाधिकारों के साथ निष्पादित करें)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$principal&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-ScheduledTaskPrincipal&lt;/span> &lt;span class="n">-UserId&lt;/span> &lt;span class="s2">&amp;#34;NT AUTHORITY\SYSTEM&amp;#34;&lt;/span> &lt;span class="n">-LogonType&lt;/span> &lt;span class="n">ServiceAccount&lt;/span> &lt;span class="n">-RunLevel&lt;/span> &lt;span class="n">Highest&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 4. कार्य सेटिंग्स का निर्माण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$settings&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-ScheduledTaskSettingsSet&lt;/span> &lt;span class="n">-AllowStartIfOnBatteries&lt;/span> &lt;span class="n">-DontStopIfGoingOnBatteries&lt;/span> &lt;span class="n">-StartWhenAvailable&lt;/span> &lt;span class="n">-DontStopOnIdleEnd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 5. कार्य का पंजीकरण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$taskName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;MyDailyAutomationTask&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Register-ScheduledTask&lt;/span> &lt;span class="n">-TaskName&lt;/span> &lt;span class="nv">$taskName&lt;/span> &lt;span class="n">-Action&lt;/span> &lt;span class="nv">$action&lt;/span> &lt;span class="n">-Trigger&lt;/span> &lt;span class="nv">$trigger&lt;/span> &lt;span class="n">-Principal&lt;/span> &lt;span class="nv">$principal&lt;/span> &lt;span class="n">-Settings&lt;/span> &lt;span class="nv">$settings&lt;/span> &lt;span class="n">-Description&lt;/span> &lt;span class="s2">&amp;#34;दैनिक कार्यों को स्वचालित रूप से निष्पादित करने का कार्य&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>सिर्फ इस स्क्रिप्ट को चलाकर, कार्य (job) टास्क शेड्यूलर में पंजीकृत हो जाएगा, और स्क्रिप्ट निर्दिष्ट समय पर प्रतिदिन SYSTEM विशेषाधिकारों (उच्चतम विशेषाधिकार, पृष्ठभूमि में स्क्रीन दिखाए बिना) के साथ निष्पादित होगी।&lt;/p>
&lt;hr>
&lt;h2 id="वयवहरक-उदहरण-1-बहर-nas-पर-बकअप-और-लग-रटशन">व्यावहारिक उदाहरण 1: बाहरी NAS पर बैकअप और लॉग रोटेशन
&lt;/h2>&lt;p>दैनिक व्यावसायिक डेटा का बैकअप लेना आवश्यक है, लेकिन मैन्युअल प्रतिलिपि (copy) करना अव्यावहारिक है। यहां, हम एक स्क्रिप्ट बनाएंगे जो PowerShell से विंडोज के सर्वश्रेष्ठ मानक कॉपी कमांड &lt;code>Robocopy&lt;/code> को कॉल करती है, निष्पादन परिणामों का लॉग आउटपुट करती है, और स्वचालित रूप से पुराने लॉग हटाती है (लॉग रोटेशन)।&lt;/p>
&lt;h3 id="नटवरक-टरसफर-म-सदधतक-नषपदन-समय-math">नेटवर्क ट्रांसफर में सैद्धांतिक निष्पादन समय (Math)
&lt;/h3>&lt;p>बैकअप स्क्रिप्ट डिज़ाइन करते समय, यह अनुमान लगाना परिचालन रूप से महत्वपूर्ण है कि प्रक्रिया को पूरा होने में कितना समय लगेगा। नेटवर्क पर NAS में बैकअप लेते समय अनुमानित आवश्यक समय $T_{backup}$ का लगभग निम्नलिखित सूत्र द्वारा अनुमान लगाया जा सकता है:&lt;/p>
$$ T_{backup} = \frac{S_{total}}{B \times (1 - \alpha)} + C \times L $$&lt;p>यहां, प्रत्येक चर निम्नलिखित है:&lt;/p>
&lt;ul>
&lt;li>$S_{total}$ : बैकअप किए जाने वाले कुल डेटा की मात्रा (Bit)&lt;/li>
&lt;li>$B$ : नेटवर्क की बैंडविड्थ (bps, उदाहरण: 1Gbps = $10^9$ bps)&lt;/li>
&lt;li>$\alpha$ : नेटवर्क या प्रोटोकॉल ओवरहेड (आमतौर पर TCP/IP या SMB प्रोटोकॉल के लिए 0.1 से 0.2)&lt;/li>
&lt;li>$C$ : फाइलों की कुल संख्या&lt;/li>
&lt;li>$L$ : प्रति फ़ाइल प्रोसेसिंग विलंबता (latency) (सेकंड)&lt;/li>
&lt;/ul>
&lt;p>विशेष रूप से, बड़ी संख्या में छोटी फाइलों (जैसे स्रोत कोड) का बैकअप लेते समय, फाइलों की संख्या $C$ ($C \times L$) के कारण विलंब शब्द प्रभावी हो जाता है। इसलिए, बैकअप प्रोसेसिंग के लिए, सरल फ़ाइल कॉपी टूल के बजाय &lt;code>Robocopy&lt;/code> का उपयोग करना सबसे अच्छा है जो मल्टीथ्रेडेड (multi-threaded) ट्रांसफर में सक्षम है।&lt;/p>
&lt;h3 id="बकअप-सकरपट-क-परससग-फल">बैकअप स्क्रिप्ट का प्रोसेसिंग फ्लो
&lt;/h3>&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;बैकअप स्क्रिप्ट शुरू करें&amp;#34;] --&amp;gt; B{&amp;#34;क्या NAS सुलभ है?&amp;#34;}
B -- हाँ --&amp;gt; C[&amp;#34;Robocopy चलाएँ (मल्टी-थ्रेडेड)&amp;#34;]
B -- नहीं --&amp;gt; D[&amp;#34;एरर लॉग लिखें और बाहर निकलें&amp;#34;]
C --&amp;gt; E{&amp;#34;क्या Robocopy सफल रहा?&amp;#34;}
E -- हाँ (ExitCode &amp;lt; 8) --&amp;gt; F[&amp;#34;लॉग रोटेट करें (पिछले 30 दिन रखें)&amp;#34;]
E -- नहीं (ExitCode &amp;gt;= 8) --&amp;gt; D
F --&amp;gt; G[&amp;#34;बैकअप स्क्रिप्ट समाप्त करें&amp;#34;]
D --&amp;gt; G
&lt;/pre>
&lt;h3 id="powershell-सकरपट-क-करयनवयन-उदहरण-backup-tonasps1">PowerShell स्क्रिप्ट का कार्यान्वयन उदाहरण (&lt;code>Backup-ToNas.ps1&lt;/code>)
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$ErrorActionPreference&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;Stop&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># सेटिंग्स&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SourceDir&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\WorkData&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$TargetNasDir&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;\\NAS01\Backup\WorkData&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$LogDir&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Scripts\Logs&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$DateStr&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Date&lt;/span> &lt;span class="n">-Format&lt;/span> &lt;span class="s2">&amp;#34;yyyyMMdd&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$LogFile&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Join-Path&lt;/span> &lt;span class="nv">$LogDir&lt;/span> &lt;span class="s2">&amp;#34;Backup_&lt;/span>&lt;span class="nv">$DateStr&lt;/span>&lt;span class="s2">.log&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$RetainDays&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="mf">30&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># 1. पूर्व-जाँच: क्या NAS पहुँचा जा सकता है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-not&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Test-Path&lt;/span> &lt;span class="nv">$TargetNasDir&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">throw&lt;/span> &lt;span class="s2">&amp;#34;NAS लक्ष्य पथ तक नहीं पहुंचा जा सकता: &lt;/span>&lt;span class="nv">$TargetNasDir&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;बैकअप शुरू हो रहा है: &lt;/span>&lt;span class="nv">$SourceDir&lt;/span>&lt;span class="s2"> -&amp;gt; &lt;/span>&lt;span class="nv">$TargetNasDir&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># 2. Robocopy निष्पादन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># /MIR : मिररिंग (स्रोत में मौजूद न होने वाली फाइलें हटा दी जाएंगी)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># /MT:16 : 16 थ्रेड्स के साथ मल्टी-थ्रेड कॉपी&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># /NP : प्रगति (%) आउटपुट न करें (लॉग को अव्यवस्थित होने से रोकने के लिए)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># /R:2 /W:2 : त्रुटि पर 2 बार पुनः प्रयास, 2 सेकंड प्रतीक्षा&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$roboArgs&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$SourceDir&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$TargetNasDir&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;/MIR&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;/MT:16&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;/NP&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;/R:2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;/W:2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;/LOG+:&lt;/span>&lt;span class="nv">$LogFile&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># PowerShell से बाहरी कमांड को कॉल करते समय Start-Process सबसे विश्वसनीय है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$process&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Start-Process&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="s2">&amp;#34;robocopy.exe&amp;#34;&lt;/span> &lt;span class="n">-ArgumentList&lt;/span> &lt;span class="nv">$roboArgs&lt;/span> &lt;span class="n">-Wait&lt;/span> &lt;span class="n">-NoNewWindow&lt;/span> &lt;span class="n">-PassThru&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$exitCode&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">ExitCode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Robocopy एग्जिट कोड स्पेसिफिकेशन: 0-7 सफलता या अपेक्षित व्यवहार हैं। 8 या उससे अधिक त्रुटि है।&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$exitCode&lt;/span> &lt;span class="o">-ge&lt;/span> &lt;span class="mf">8&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">throw&lt;/span> &lt;span class="s2">&amp;#34;Robocopy त्रुटि के साथ बाहर निकला। ExitCode: &lt;/span>&lt;span class="nv">$exitCode&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;बैकअप सफलतापूर्वक पूरा हुआ। ExitCode: &lt;/span>&lt;span class="nv">$exitCode&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># 3. लॉग रोटेशन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;पुरानी लॉग फ़ाइलों को हटाया जा रहा है (रिटेंशन अवधि: &lt;/span>&lt;span class="nv">${RetainDays}&lt;/span>&lt;span class="s2"> दिन)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$limitDate&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Get-Date&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="py">AddDays&lt;/span>&lt;span class="p">(-&lt;/span>&lt;span class="nv">$RetainDays&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Get-ChildItem&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$LogDir&lt;/span> &lt;span class="n">-Filter&lt;/span> &lt;span class="s2">&amp;#34;Backup_*.log&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Where-Object&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">LastWriteTime&lt;/span> &lt;span class="o">-lt&lt;/span> &lt;span class="nv">$limitDate&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Remove-Item&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;लॉग क्लीनअप पूरा हुआ।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$errorMessage&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;बैकअप प्रक्रिया के दौरान एक त्रुटि हुई: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Exception&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Message&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Error&lt;/span> &lt;span class="nv">$errorMessage&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># वास्तविक त्रुटि लॉग फ़ाइल में लिखें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Add-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Join-Path&lt;/span> &lt;span class="nv">$LogDir&lt;/span> &lt;span class="s2">&amp;#34;Error.log&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;[(Get-Date -Format &amp;#39;yyyy-MM-dd HH:mm:ss&amp;#39;)] &lt;/span>&lt;span class="nv">$errorMessage&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># टास्क शेड्यूलर को त्रुटि सूचित करने के लिए नॉन-ज़ीरो के साथ बाहर निकलें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span> &lt;span class="mf">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>जब टास्क शेड्यूलर के साथ जोड़ा जाता है, तो यह स्क्रिप्ट दैनिक रूप से पूरी तरह से स्वचालित बैकअप प्रदान करती है। विशेष रूप से &lt;code>Robocopy&lt;/code> का एग्जिट कोड प्रोसेसिंग बहुत महत्वपूर्ण है। Robocopy सफल होने पर भी, यह 1 लौटाता है यदि &amp;ldquo;नई फाइलें कॉपी की गईं&amp;rdquo;, और 2 यदि &amp;ldquo;अतिरिक्त फाइलें हटा दी गईं&amp;rdquo;, इसलिए यह ध्यान रखना महत्वपूर्ण है कि एक साधारण &lt;code>$LASTEXITCODE -eq 0&lt;/code> जांच सही ढंग से काम नहीं करेगी।&lt;/p>
&lt;hr>
&lt;h2 id="वयवहरक-उदहरण-2-ससटम-इवट-लग-मनटरग-और-slack-नटफकशन-webhook">व्यावहारिक उदाहरण 2: सिस्टम इवेंट लॉग मॉनिटरिंग और Slack नोटिफिकेशन (Webhook)
&lt;/h2>&lt;p>विंडोज सर्वर और क्रिएटर वर्कस्टेशन में, डिस्क त्रुटियों या एप्लिकेशन क्रैश (Application Error) का शीघ्र पता लगाना बहुत महत्वपूर्ण है, जो ब्लू स्क्रीन (BSoD) के संकेत हो सकते हैं।
यहां, हम एक स्क्रिप्ट बनाएंगे जो पिछले 1 घंटे के &lt;code>System&lt;/code> और &lt;code>Application&lt;/code> इवेंट लॉग से &amp;ldquo;त्रुटि (Error)&amp;rdquo; और &amp;ldquo;गंभीर (Critical)&amp;rdquo; स्तर के लॉग निकालती है और यदि वे पाए जाते हैं तो Slack को एक सूचना भेजती है।&lt;/p>
&lt;h3 id="अधसचन-परससकरण-क-अनकरम-आरख-sequence-diagram">अधिसूचना प्रसंस्करण का अनुक्रम आरेख (Sequence Diagram)
&lt;/h3>&lt;pre class="mermaid">
sequenceDiagram
participant S as &amp;#34;निर्धारित कार्य (Scheduled Task)&amp;#34;
participant P as &amp;#34;PowerShell स्क्रिप्ट&amp;#34;
participant W as &amp;#34;Windows इवेंट लॉग&amp;#34;
participant Sl as &amp;#34;Slack API&amp;#34;
S-&amp;gt;&amp;gt;P: &amp;#34;स्क्रिप्ट ट्रिगर करें (हर घंटे)&amp;#34;
P-&amp;gt;&amp;gt;W: &amp;#34;Get-WinEvent (पिछले 1 घंटे में गंभीर/त्रुटि)&amp;#34;
W--&amp;gt;&amp;gt;P: &amp;#34;लॉग ऑब्जेक्ट्स लौटाएँ&amp;#34;
alt &amp;#34;त्रुटियाँ मिलीं&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;संदेश प्रारूपित करें (JSON)&amp;#34;
P-&amp;gt;&amp;gt;Sl: &amp;#34;Invoke-RestMethod (POST webhook_url)&amp;#34;
Sl--&amp;gt;&amp;gt;P: &amp;#34;200 OK&amp;#34;
else &amp;#34;कोई त्रुटि नहीं&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;शांतिपूर्वक बाहर निकलें&amp;#34;
end
&lt;/pre>
&lt;h3 id="powershell-सकरपट-क-करयनवयन-उदहरण-monitor-eventlogps1">PowerShell स्क्रिप्ट का कार्यान्वयन उदाहरण (&lt;code>Monitor-EventLog.ps1&lt;/code>)
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$ErrorActionPreference&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;Stop&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Slack Webhook URL (पहले से Slack के Incoming Webhooks इंटीग्रेशन से प्राप्त करें)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SlackWebhookUrl&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXXXXXXX&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># खोज के लिए समय सीमा (पिछले 1 घंटे)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$startTime&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Get-Date&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="py">AddHours&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">-1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># ईवेंट लॉग को तेज़ी से खोजने के लिए XPath फ़िल्टर का उपयोग करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># स्तर 1: गंभीर(Critical), 2: त्रुटि(Error)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$xmlFilter&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="sh">@&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">&amp;lt;QueryList&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> &amp;lt;Query Id=&amp;#34;0&amp;#34; Path=&amp;#34;System&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> &amp;lt;Select Path=&amp;#34;System&amp;#34;&amp;gt;*[System[(Level=1 or Level=2) and TimeCreated[@SystemTime&amp;amp;gt;=&amp;#39;&lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$startTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">ToUniversalTime&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="py">ToString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;o&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="sh">&amp;#39;]]]&amp;lt;/Select&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> &amp;lt;/Query&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> &amp;lt;Query Id=&amp;#34;1&amp;#34; Path=&amp;#34;Application&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> &amp;lt;Select Path=&amp;#34;Application&amp;#34;&amp;gt;*[System[(Level=1 or Level=2) and TimeCreated[@SystemTime&amp;amp;gt;=&amp;#39;&lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$startTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">ToUniversalTime&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="py">ToString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;o&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="sh">&amp;#39;]]]&amp;lt;/Select&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> &amp;lt;/Query&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">&amp;lt;/QueryList&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">&amp;#34;@&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Get-WinEvent के साथ लॉग प्राप्त करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># -ErrorAction SilentlyContinue इसलिए है ताकि अगर कोई लॉग न मिले तो त्रुटि को अनदेखा किया जा सके&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$events&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-WinEvent&lt;/span> &lt;span class="n">-FilterXml&lt;/span> &lt;span class="nv">$xmlFilter&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">SilentlyContinue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$events&lt;/span> &lt;span class="o">-and&lt;/span> &lt;span class="nv">$events&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Count&lt;/span> &lt;span class="o">-gt&lt;/span> &lt;span class="mf">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$eventCount&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$events&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Count&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;पिछले 1 घंटे में &lt;/span>&lt;span class="nv">$eventCount&lt;/span>&lt;span class="s2"> त्रुटि/गंभीर लॉग पाए गए।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># अधिसूचना के लिए टेक्स्ट इकट्ठा करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$messageBody&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;*Windows सिस्टम अलर्ट* :rotating_light:&lt;/span>&lt;span class="se">`n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$messageBody&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s2">&amp;#34;पिछले 1 घंटे में &lt;/span>&lt;span class="nv">$eventCount&lt;/span>&lt;span class="s2"> त्रुटियाँ पाई गईं।&lt;/span>&lt;span class="se">`n`n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># केवल नवीनतम 3 के विवरण शामिल करें (अक्षर सीमा आदि पर विचार करते हुए)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$events&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Select-Object&lt;/span> &lt;span class="n">-First&lt;/span> &lt;span class="mf">3&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">ForEach-Object&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$messageBody&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s2">&amp;#34;*&lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">LogName&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">* - &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">ProviderName&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2"> (EventID: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Id&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">)&lt;/span>&lt;span class="se">`n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$messageBody&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s2">&amp;#34;&amp;gt; &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Message&lt;/span> &lt;span class="o">-replace&lt;/span> &lt;span class="s1">&amp;#39;`n&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="se">`n`n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$eventCount&lt;/span> &lt;span class="o">-gt&lt;/span> &lt;span class="mf">3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$messageBody&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s2">&amp;#34;※ अन्य &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$eventCount&lt;/span> &lt;span class="p">-&lt;/span> &lt;span class="mf">3&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2"> त्रुटियाँ हैं। कृपया इवेंट व्यूअर (Event Viewer) की जाँच करें।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Slack पर पोस्ट करने के लिए JSON पेलोड बनाएं&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$payload&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">text&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$messageBody&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">username&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;SystemMonitor&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">icon_emoji&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;:desktop_computer:&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$jsonPayload&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$payload&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">ConvertTo-Json&lt;/span> &lt;span class="n">-Depth&lt;/span> &lt;span class="mf">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># REST API को कॉल करके Slack पर भेजें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Invoke-RestMethod&lt;/span> &lt;span class="n">-Uri&lt;/span> &lt;span class="nv">$SlackWebhookUrl&lt;/span> &lt;span class="n">-Method&lt;/span> &lt;span class="n">Post&lt;/span> &lt;span class="n">-Body&lt;/span> &lt;span class="nv">$jsonPayload&lt;/span> &lt;span class="n">-ContentType&lt;/span> &lt;span class="s2">&amp;#34;application/json; charset=utf-8&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Slack अधिसूचना पूरी हुई।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;कोई त्रुटि/गंभीर लॉग नहीं मिला। सिस्टम सामान्य है।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Error&lt;/span> &lt;span class="s2">&amp;#34;इवेंट लॉग मॉनिटरिंग स्क्रिप्ट में त्रुटि हुई: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Exception&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Message&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span> &lt;span class="mf">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस स्क्रिप्ट का तकनीकी बिंदु यह है कि यह &lt;code>Get-WinEvent -FilterXml&lt;/code> का उपयोग करता है। पाइपलाइन के माध्यम से पारंपरिक &lt;code>Get-EventLog&lt;/code> कमांडलेट या &lt;code>Where-Object&lt;/code> के साथ फ़िल्टर करना बहुत धीमा है, क्योंकि यह फ़िल्टर करने से पहले सभी ईवेंट ऑब्जेक्ट्स को मेमोरी में लोड करता है। XML फ़िल्टर का उपयोग करने से Windows ईवेंट लॉग सेवा के स्तर पर फ़िल्टरिंग होती है, जिससे प्रदर्शन में बड़े पैमाने पर सुधार होता है और निष्पादन का समय कुछ सेकंड के भीतर आ जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="वयवहरक-उदहरण-3-कई-git-रपजटर-क-बच-अपडट-और-बलड-ऑटमशन">व्यावहारिक उदाहरण 3: कई Git रिपॉजिटरी का बैच अपडेट और बिल्ड ऑटोमेशन
&lt;/h2>&lt;p>डेवलपर्स के लिए, हर सुबह अपने कार्य PC (जैसे फ्रंटएंड, बैकएंड, इंफ्रास्ट्रक्चर रिपॉजिटरी आदि) पर कई Git रिपॉजिटरी को नवीनतम &lt;code>main&lt;/code> शाखा (branch) के साथ सिंक करना, और आवश्यकतानुसार पैकेज इंस्टॉल करना (जैसे &lt;code>npm install&lt;/code>) या निर्माण (build) कार्य करना बहुत थकाऊ हो सकता है।
हम एक टूल बनाएंगे जो PowerShell स्क्रिप्ट का उपयोग करके यह सब एक साथ करता है।&lt;/p>
&lt;p>यह स्क्रिप्ट एक विशिष्ट मूल निर्देशिका (parent directory) के अंतर्गत सभी Git रिपॉजिटरी का स्वचालित रूप से पता लगाती है, और यदि कोई अनकमिटेड (uncommitted) परिवर्तन नहीं हैं तो &lt;code>git pull&lt;/code> निष्पादित करती है। इसके अलावा, यदि नए परिवर्तन खींचे (pull) जाते हैं, तो यह स्वचालित रूप से एक बिल्ड कमांड जारी करता है।&lt;/p>
&lt;h3 id="कई-रपजटर-ऑट-अपडट-सकरपट-update-gitreposps1">कई रिपॉजिटरी ऑटो-अपडेट स्क्रिप्ट (&lt;code>Update-GitRepos.ps1&lt;/code>)
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;span class="lnt">74
&lt;/span>&lt;span class="lnt">75
&lt;/span>&lt;span class="lnt">76
&lt;/span>&lt;span class="lnt">77
&lt;/span>&lt;span class="lnt">78
&lt;/span>&lt;span class="lnt">79
&lt;/span>&lt;span class="lnt">80
&lt;/span>&lt;span class="lnt">81
&lt;/span>&lt;span class="lnt">82
&lt;/span>&lt;span class="lnt">83
&lt;/span>&lt;span class="lnt">84
&lt;/span>&lt;span class="lnt">85
&lt;/span>&lt;span class="lnt">86
&lt;/span>&lt;span class="lnt">87
&lt;/span>&lt;span class="lnt">88
&lt;/span>&lt;span class="lnt">89
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$ErrorActionPreference&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;Stop&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># पैरेंट डायरेक्टरीज़ की सूची जहाँ रिपॉजिटरी स्थित हैं&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$TargetDirectories&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;C:\Dev\FrontendProjects&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;C:\Dev\BackendProjects&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># प्रत्येक निर्देशिका (directory) को खोजना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">foreach&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$parentDir&lt;/span> &lt;span class="k">in&lt;/span> &lt;span class="nv">$TargetDirectories&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-not&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Test-Path&lt;/span> &lt;span class="nv">$parentDir&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Warning&lt;/span> &lt;span class="s2">&amp;#34;निर्देशिका नहीं मिली: &lt;/span>&lt;span class="nv">$parentDir&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># उप-निर्देशिकाओं (subdirectories) की सूची प्राप्त करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$subDirs&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-ChildItem&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$parentDir&lt;/span> &lt;span class="n">-Directory&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">foreach&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$repoDir&lt;/span> &lt;span class="k">in&lt;/span> &lt;span class="nv">$subDirs&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$repoPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$repoDir&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">FullName&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$gitDir&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Join-Path&lt;/span> &lt;span class="nv">$repoPath&lt;/span> &lt;span class="s2">&amp;#34;.git&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># जाँचें कि क्या .git फ़ोल्डर मौजूद है (क्या यह Git रिपॉजिटरी है)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Test-Path&lt;/span> &lt;span class="nv">$gitDir&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;---------------------------------&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;रिपॉजिटरी को संसाधित किया जा रहा है: &lt;/span>&lt;span class="nv">$repoPath&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="n">-ForegroundColor&lt;/span> &lt;span class="n">Cyan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># PowerShell की वर्तमान कार्यशील निर्देशिका बदलें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-Location&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$repoPath&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># जाँचें कि क्या अनकमिटेड परिवर्तन हैं&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$status&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">git&lt;/span> &lt;span class="n">status&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-porcelain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$status&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;अनकमिटेड परिवर्तनों के कारण छोड़ (Skip) दिया गया।&amp;#34;&lt;/span> &lt;span class="n">-ForegroundColor&lt;/span> &lt;span class="n">Yellow&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># वर्तमान शाखा (branch) प्राप्त करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$branch&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">git&lt;/span> &lt;span class="nb">rev-parse&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-abbrev-ref&lt;/span> &lt;span class="n">HEAD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$branch&lt;/span> &lt;span class="o">-ne&lt;/span> &lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span> &lt;span class="o">-and&lt;/span> &lt;span class="nv">$branch&lt;/span> &lt;span class="o">-ne&lt;/span> &lt;span class="s2">&amp;#34;master&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;वर्तमान शाखा &lt;/span>&lt;span class="nv">$branch&lt;/span>&lt;span class="s2"> होने के कारण छोड़ दिया गया (केवल main/master लक्षित हैं)।&amp;#34;&lt;/span> &lt;span class="n">-ForegroundColor&lt;/span> &lt;span class="n">Yellow&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Pull निष्पादित करें और परिणाम को चर (variable) में सहेजें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;रिमोट से नवीनतम प्राप्त कर रहे हैं (git pull)...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$pullResult&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">git&lt;/span> &lt;span class="n">pull&lt;/span> &lt;span class="n">origin&lt;/span> &lt;span class="nv">$branch&lt;/span> &lt;span class="mf">2&lt;/span>&lt;span class="p">&amp;gt;&amp;amp;&lt;/span>&lt;span class="mf">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># कंसोल पर भी आउटपुट&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$pullResult&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">ForEach-Object&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34; &lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># यदि इसमें &amp;#34;Already up to date.&amp;#34; के अलावा अन्य स्ट्रिंग शामिल है, तो मान लें कि अपडेट किया गया था&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$isUpdated&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">$false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">foreach&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$line&lt;/span> &lt;span class="k">in&lt;/span> &lt;span class="nv">$pullResult&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$line&lt;/span> &lt;span class="o">-notmatch&lt;/span> &lt;span class="s2">&amp;#34;Already up to date&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$isUpdated&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">$true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$isUpdated&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;रिपॉजिटरी अपडेट कर दी गई है। बिल्ड कार्य शुरू हो رہا है...&amp;#34;&lt;/span> &lt;span class="n">-ForegroundColor&lt;/span> &lt;span class="n">Green&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># यदि package.json मौजूद है, तो npm install और npm run build निष्पादित करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Test-Path&lt;/span> &lt;span class="s2">&amp;#34;package.json&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;npm install निष्पादित हो रहा है...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">npm&lt;/span> &lt;span class="n">install&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;npm run build निष्पादित हो रहा है...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">npm&lt;/span> &lt;span class="n">run&lt;/span> &lt;span class="n">build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># यदि .sln (विजुअल स्टूडियो सॉल्यूशन) मौजूद है, तो msbuild या dotnet build निष्पादित करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$slnFiles&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-ChildItem&lt;/span> &lt;span class="n">-Filter&lt;/span> &lt;span class="s2">&amp;#34;*.sln&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$slnFiles&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Count&lt;/span> &lt;span class="o">-gt&lt;/span> &lt;span class="mf">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;.NET एप्लिकेशन को बिल्ड किया जा रहा है...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dotnet&lt;/span> &lt;span class="n">build&lt;/span> &lt;span class="nv">$slnFiles&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mf">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="py">FullName&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Error&lt;/span> &lt;span class="s2">&amp;#34;रिपॉजिटरी &lt;/span>&lt;span class="nv">$repoPath&lt;/span>&lt;span class="s2"> को संसाधित करते समय एक त्रुटि हुई: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Exception&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Message&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;---------------------------------&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;सभी रिपॉजिटरी के लिए अद्यतन (Update) प्रक्रिया पूरी हुई।&amp;#34;&lt;/span> &lt;span class="n">-ForegroundColor&lt;/span> &lt;span class="n">Green&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस स्क्रिप्ट को इस तरह डिज़ाइन किया गया है कि यदि कोई त्रुटि होती है, तो भी &lt;code>try / catch&lt;/code> और &lt;code>foreach&lt;/code> लूप यह सुनिश्चित करते हैं कि अगली रिपॉजिटरी का प्रसंस्करण प्रभावित हुए बिना जारी रहे। इसके अलावा, &lt;code>git status --porcelain&lt;/code> विकल्प, जो स्क्रिप्ट प्रसंस्करण के लिए अभिप्रेत है, का उपयोग कार्यशील ट्री की स्वच्छता को मज़बूती से निर्धारित करने के लिए किया जाता है। इस स्क्रिप्ट को स्टार्टअप फ़ोल्डर में रखकर या उपयोगकर्ता के लॉगऑन पर इसे टास्क शेड्यूलर में पंजीकृत करके, जब तक आप अपने पीसी को चालू करते हैं और कॉफी बनाते हैं, तब तक आपका पूरा विकास परिवेश नवीनतम स्थिति में होगा।&lt;/p>
&lt;hr>
&lt;h2 id="परचलन-सबध-सवधनय-और-उननत-तकनक">परिचालन संबंधी सावधानियाँ और उन्नत तकनीकें
&lt;/h2>&lt;p>लंबे समय तक स्वचालित स्क्रिप्ट के लिए PowerShell का उपयोग करते समय ध्यान में रखने के लिए कुछ सर्वोत्तम अभ्यास (best practices) हैं।&lt;/p>
&lt;h3 id="1-करडशयलस-क-सरकषत-परबधन">1. क्रेडेंशियल्स का सुरक्षित प्रबंधन
&lt;/h3>&lt;p>स्क्रिप्ट के अंदर पासवर्ड और API कुंजियों (जैसे Slack Webhook URL, डेटाबेस कनेक्शन स्ट्रिंग) को सादे पाठ (plain text) में हार्ड-कोड करना एक बड़ा सुरक्षा जोखिम है। PowerShell में &lt;code>Export-Clixml&lt;/code> और &lt;code>ConvertFrom-SecureString&lt;/code> जैसे फ़ंक्शन होते हैं जो क्रेडेंशियल्स को एन्क्रिप्ट करके सहेजने की अनुमति देते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># पहली बार केवल मैन्युअल निष्पादन (पासवर्ड इनपुट डायलॉग प्रदर्शित किया जाएगा)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Get-Credential | Export-Clixml -Path &amp;#34;C:\Scripts\Creds\admin.xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># स्वचालन स्क्रिप्ट में पढ़ रहे हैं&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$cred&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Import-Clixml&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\Scripts\Creds\admin.xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># रिमोट सर्वर आदि से कनेक्ट करने के लिए $cred का उपयोग करें&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यह सुरक्षित क्रेडेंशियल हैंडलिंग की अनुमति देता है जिसे केवल स्क्रिप्ट निष्पादित करने वाले उपयोगकर्ता की प्रोफ़ाइल द्वारा डिक्रिप्ट किया जा सकता है।&lt;/p>
&lt;h3 id="2-टरसकरपट-transcript-क-सथ-परण-नषपदन-लग-रकरडग">2. ट्रांसक्रिप्ट (Transcript) के साथ पूर्ण निष्पादन लॉग रिकॉर्डिंग
&lt;/h3>&lt;p>पिछले उदाहरण में, हमने &lt;code>Add-Content&lt;/code> आदि का उपयोग करके अलग-अलग लॉग आउटपुट किए थे, लेकिन PowerShell में एक ट्रांसक्रिप्ट सुविधा होती है जो स्वचालित रूप से स्क्रीन पर आउटपुट की गई सभी जानकारी (त्रुटि संदेश और मानक आउटपुट सहित) को फ़ाइल में लिखती है।&lt;/p>
&lt;p>स्क्रिप्ट के शुरुआत और अंत में बस निम्नलिखित जोड़कर, आप एक मज़बूत ऑडिट लॉग बना सकते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Start-Transcript&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\Scripts\Logs\Execution_&lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nb">Get-Date&lt;/span> &lt;span class="n">-Format&lt;/span> &lt;span class="s1">&amp;#39;yyyyMMdd_HHmmss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">.log&amp;#34;&lt;/span> &lt;span class="n">-Append&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># (स्क्रिप्ट का मुख्य प्रसंस्करण यहाँ)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Stop-Transcript&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="3-मनटरग-क-लए-गणतय-दषटकण-और-वसगत-क-पत-लगन-math">3. मॉनिटरिंग के लिए गणितीय दृष्टिकोण और विसंगति का पता लगाना (Math)
&lt;/h3>&lt;p>बड़े पैमाने के स्वचालन में, केवल त्रुटियों का पता लगाना ही प्रभावी नहीं है, बल्कि &amp;ldquo;सामान्य से कुछ अलग&amp;rdquo; सांख्यिकीय रूप से पता लगाना भी प्रभावी है। उदाहरण के लिए, यदि दैनिक बैकअप समय सामान्य औसत से काफी अलग है, तो यह नेटवर्क विसंगतियों (anomalies) या डिस्क विफलता का संकेत हो सकता है।&lt;/p>
&lt;p>यदि दैनिक बैकअप समय $x_1, x_2, \dots, x_n$ है, तो नमूना माध्य $\mu$ और मानक विचलन $\sigma$ की गणना निम्नानुसार की जा सकती है:&lt;/p>
$$ \mu = \frac{1}{n} \sum_{i=1}^n x_i $$$$ \sigma = \sqrt{ \frac{1}{n-1} \sum_{i=1}^n (x_i - \mu)^2 } $$&lt;p>यदि चालू दिन का निष्पादन समय $x_{today}$, $\mu + 3\sigma$ (3-सिग्मा नियम) से अधिक हो जाता है, तो सिस्टम को यह मानने के लिए प्रोग्राम किया जा सकता है कि &amp;ldquo;एक सांख्यिकीय विसंगति हुई है&amp;rdquo; और एक चेतावनी सूचना जारी कर सकता है। PowerShell के &lt;code>Measure-Object&lt;/code> कमांडलेट का उपयोग करके, आप कुछ ही पंक्तियों में इस तरह का सांख्यिकीय प्रसंस्करण लागू कर सकते हैं।&lt;/p>
&lt;h2 id="नषकरष">निष्कर्ष
&lt;/h2>&lt;p>इस लेख में, हमने Windows परिवेश में PowerShell का उपयोग करके दैनिक नियमित कार्यों के पूर्ण स्वचालन के व्यावहारिक उदाहरणों की व्याख्या की।
निष्पादन नीतियों के प्रबंधन और मॉड्यूलरकरण के माध्यम से नींव बनाने से लेकर बैकअप और लॉग रोटेशन, इवेंट लॉग मॉनिटरिंग और Slack सूचनाएं, और एकाधिक Git रिपॉजिटरी के स्वचालित निर्माण (builds) तक, हमने ऐसी स्क्रिप्ट पेश कीं जिनका तुरंत अभ्यास में उपयोग किया जा सकता है।&lt;/p>
&lt;p>PowerShell बहुत गहरा है; एक कमांड लाइन टूल होने के बावजूद, यह एक शक्तिशाली स्वचालन इंजन है जो .NET की लगभग सभी विशेषताओं तक पहुंच सकता है। अपने काम के माहौल के अनुरूप पथ (paths) और प्रोसेसिंग लॉजिक को कस्टमाइज़ करने के लिए यहां पेश की गई स्क्रिप्ट का उपयोग आधार के रूप में करें, और थकाऊ मैन्युअल काम से मुक्त होकर रचनात्मक समय वापस पाएं।&lt;/p>
&lt;p>स्वचालन की सफलता &amp;ldquo;एक छोटी स्क्रिप्ट से शुरू होने और धीरे-धीरे एरर हैंडलिंग और लॉग आउटपुट जैसी मजबूती (robustness) को बढ़ाने&amp;rdquo; पर निर्भर करती है। क्यों न अपने स्वयं के पीसी पर एक फ़ोल्डर का बैकअप लेकर PowerShell स्वचालन की अपनी यात्रा शुरू की जाए?&lt;/p></description></item><item><title>PowerShell और C++ का एकीकरण: सिस्टम प्रबंधन स्वचालन तकनीक</title><link>http://kenji.blog/hi/p/powershell-cpp-system-automation/</link><pubDate>Sat, 12 Sep 2026 16:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/powershell-cpp-system-automation/</guid><description>&lt;img src="http://kenji.blog/p/powershell-cpp-system-automation/img/eyecatch.jpg" alt="Featured image of post PowerShell और C++ का एकीकरण: सिस्टम प्रबंधन स्वचालन तकनीक" />&lt;h2 id="परचय">परिचय
&lt;/h2>&lt;p>Windows सिस्टम प्रबंधन और स्वचालन (automation) में, PowerShell एक वास्तविक मानक उपकरण (de facto standard tool) बन गया है। Active Directory का प्रबंधन, फ़ाइल सिस्टम का संचालन, नेटवर्क कॉन्फ़िगरेशन में बदलाव आदि जैसे हर कार्य को स्क्रिप्ट द्वारा लिखा जा सकता है। हालाँकि, जहाँ PowerShell सर्वशक्तिमान है, वहीं इसके स्क्रिप्टिंग भाषा-विशिष्ट प्रदर्शन की सीमाएँ हैं और बहुत निम्न-स्तरीय (low-level) Windows API तक पहुँचने में संघर्ष करने जैसी परिस्थितियाँ भी मौजूद हैं।&lt;/p>
&lt;p>यहाँ एक शक्तिशाली समाधान &amp;ldquo;C++ के साथ एकीकरण&amp;rdquo; है। C++ मूल निष्पादन गति (native execution speed) और Win32 API व COM ऑब्जेक्ट्स तक पूर्ण पहुँच प्रदान करता है। PowerShell की &amp;ldquo;उच्च उत्पादकता और लचीलापन&amp;rdquo; को C++ के &amp;ldquo;अत्यधिक प्रदर्शन और निम्न-स्तरीय नियंत्रण&amp;rdquo; के साथ जोड़कर, एंटरप्राइज़ वातावरण में बेहद जटिल और बड़े पैमाने पर सिस्टम प्रबंधन कार्यों को अनुकूलित (optimize) करना संभव हो जाता है।&lt;/p>
&lt;p>इस लेख में, हम PowerShell और C++ को द्विदिश रूप (bidirectionally) से जोड़ने के लिए विशिष्ट आर्किटेक्चर, कार्यान्वयन (implementation) विधियों, और मेमोरी प्रबंधन व स्ट्रिंग रूपांतरण के सर्वोत्तम अभ्यासों (best practices) के बारे में बहुत विस्तार से बताएंगे।&lt;/p>
&lt;h2 id="powershell-और-c-क-एक-सथ-कय-जड">PowerShell और C++ को एक साथ क्यों जोड़ें?
&lt;/h2>&lt;h3 id="1-परदरशन-performance-क-समओ-क-पर-करन">1. प्रदर्शन (Performance) की सीमाओं को पार करना
&lt;/h3>&lt;p>PowerShell में .NET Framework (या .NET Core / .NET) पर चलने वाले इंटरप्रिटेड (interpreted) और डायनेमिकली टाइप्ड (dynamically typed) भाषा के तत्व हैं। इसलिए, बड़ी मात्रा में टेक्स्ट को संसाधित (process) करते समय, जटिल एन्क्रिप्शन प्रक्रियाएँ करते समय, या लाखों इवेंट लॉग्स का विश्लेषण करते समय, निष्पादन गति और मेमोरी की खपत एक बाधा (bottleneck) बन सकती है।&lt;/p>
&lt;p>आइए गणना की जटिलता (computational complexity) और प्रसंस्करण समय (processing time) के मॉडल पर विचार करें। यह मानते हुए कि किसी कार्य का कुल प्रसंस्करण समय $T_{total}$ है, अकेले PowerShell के साथ प्रसंस्करण समय और C++ पर ऑफलोड (offload) किए जाने पर प्रसंस्करण समय को निम्नानुसार तैयार किया जा सकता है।&lt;/p>
$$ T_{total}^{(PS)} = N \times (t_{overhead} + t_{compute}^{(PS)}) $$$$ T_{total}^{(C++)} = t_{interop} + N \times t_{compute}^{(C++)} $$&lt;p>यहाँ, $N$ संसाधित किए जाने वाले तत्वों की संख्या है, $t_{overhead}$ PowerShell के लूप प्रसंस्करण से जुड़ा ओवरहेड है, $t_{compute}$ प्रति तत्व शुद्ध गणना समय है, और $t_{interop}$ P/Invoke आदि द्वारा सीमा कॉलिंग (boundary calling) का ओवरहेड है।&lt;/p>
&lt;p>जब $N$ पर्याप्त रूप से बड़ा होता है, $t_{overhead} \gg 0$ और $t_{compute}^{(PS)} > t_{compute}^{(C++)}$, इसलिए प्रारंभिक $t_{interop}$ का भुगतान करके भी C++ को प्रसंस्करण सौंपना (ऑफलोड करना) समग्र विलंबता (latency) को नाटकीय रूप से कम कर देता है।&lt;/p>
&lt;h3 id="2-नटव-win32-api-तक-पहच">2. नेटिव Win32 API तक पहुँच
&lt;/h3>&lt;p>यद्यपि &lt;code>Add-Type&lt;/code> का उपयोग करके C# के माध्यम से Win32 API को कॉल करना अकेले PowerShell के साथ संभव है, लेकिन सीधे C# / PowerShell में जटिल संरचनाओं (structures) और कॉलबैक फ़ंक्शंस (जैसे: मिनीफ़िल्टर ड्राइवर नियंत्रण, उन्नत प्रक्रिया मेमोरी हेरफेर) को परिभाषित करना बहुत मुश्किल है। C++ में लिपटे (wrapped) एक नेटिव DLL बनाकर और उसे PowerShell से कॉल करके, टाइप-सेफ (type-safe) और विश्वसनीय सिस्टम नियंत्रण संभव हो जाता है।&lt;/p>
&lt;h2 id="powershell-स-c-नटव-dll-क-कल-करन">PowerShell से C++ नेटिव DLL को कॉल करना
&lt;/h2>&lt;p>सबसे आम एकीकरण पैटर्न भारी प्रसंस्करण या सिस्टम-विशिष्ट प्रसंस्करण को C++ DLL के रूप में लागू करना और उसे PowerShell स्क्रिप्ट से कॉल करना है।&lt;/p>
&lt;h3 id="c-सइड-dll-करयनवयन-win32-api-और-कसटम-लजक">C++ साइड DLL कार्यान्वयन (Win32 API और कस्टम लॉजिक)
&lt;/h3>&lt;p>सबसे पहले, एक C++ DLL बनाएं जिसमें एक एक्सपोर्ट फ़ंक्शन हो जिसे PowerShell से कॉल किया जा सके। यहाँ एक साधारण C++ कोड का उदाहरण दिया गया है जो &amp;ldquo;बड़े पैमाने पर स्ट्रिंग डेटा एन्क्रिप्शन/डिक्रिप्शन, या जटिल हैश गणना फ़ंक्शन&amp;rdquo; की कल्पना करता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// NativeLib.cpp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;windows.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// P/Invoke के साथ आसानी से कॉल करने के लिए C लिंकेज और __stdcall निर्दिष्ट करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">extern&lt;/span> &lt;span class="s">&amp;#34;C&amp;#34;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">__declspec&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dllexport&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="kr">__stdcall&lt;/span> &lt;span class="n">ComputeHeavyTask&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">multiplier&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">dataSize&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// जानबूझकर भारी प्रसंस्करण का अनुकरण (simulation)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">dataSize&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">multiplier&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// स्ट्रिंग को संसाधित करने वाला फ़ंक्शन (Unicode समर्थन के लिए LPWSTR का उपयोग करता है)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kr">__declspec&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dllexport&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="kr">__stdcall&lt;/span> &lt;span class="n">ProcessSystemString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LPCWSTR&lt;/span> &lt;span class="n">inputString&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">LPWSTR&lt;/span> &lt;span class="n">outputBuffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">bufferSize&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">inputString&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="k">nullptr&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">outputBuffer&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="k">nullptr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">inputString&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// कुछ जटिल स्ट्रिंग प्रसंस्करण (उदाहरण: सिस्टम पहचानकर्ता (identifier) जोड़ना)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;PROCESSED_&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">str&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">length&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">size_t&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">bufferSize&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// बफर ओवररन (buffer overrun) से बचाना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">wcscpy_s&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">outputBuffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bufferSize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c_str&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="ममर-परबधन-और-सटरग-रपतरण-bstr-lpwstr">मेमोरी प्रबंधन और स्ट्रिंग रूपांतरण (&lt;code>BSTR&lt;/code>, &lt;code>LPWSTR&lt;/code>)
&lt;/h3>&lt;p>C++ और PowerShell (.NET) के बीच डेटा का आदान-प्रदान करते समय ध्यान देने योग्य सबसे महत्वपूर्ण बातें &lt;strong>स्ट्रिंग एन्कोडिंग&lt;/strong> और &lt;strong>मेमोरी प्रबंधन&lt;/strong> हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>LPCWSTR&lt;/code> / &lt;code>LPWSTR&lt;/code>&lt;/strong>: C/C++ वाइड स्ट्रिंग पॉइंटर (UTF-16LE)। यह मानक रूप से Windows API के &lt;code>W&lt;/code> फ़ंक्शंस में उपयोग किया जाता है। P/Invoke में &lt;code>CharSet = CharSet.Unicode&lt;/code> निर्दिष्ट करके, यह स्वचालित रूप से .NET के &lt;code>String&lt;/code> और &lt;code>StringBuilder&lt;/code> के साथ मार्शल (marshal) हो जाता है।&lt;/li>
&lt;li>&lt;strong>&lt;code>BSTR&lt;/code>&lt;/strong>: COM (Component Object Model) में प्रयुक्त लंबाई-उपसर्ग (length-prefixed) वाली वाइड स्ट्रिंग। मेमोरी को &lt;code>SysAllocString&lt;/code> और &lt;code>SysFreeString&lt;/code> के साथ प्रबंधित किया जाना चाहिए। P/Invoke में &lt;code>[MarshalAs(UnmanagedType.BStr)]&lt;/code> निर्दिष्ट करें।&lt;/li>
&lt;/ul>
&lt;p>जब C++ साइड नई मेमोरी आवंटित करता है और इसे PowerShell साइड को वापस करता है, तो यह सवाल उठता है कि मेमोरी कौन मुक्त (free) करेगा (स्वामित्व (ownership))। उपर्युक्त &lt;code>ProcessSystemString&lt;/code> फ़ंक्शन में, हम मानक Win32 API पैटर्न को अपनाते हैं जहाँ &amp;ldquo;कॉल करने वाला (PowerShell) द्वारा पूर्व-आवंटित बफर (&lt;code>outputBuffer&lt;/code>) में C++ परिणाम लिखता है&amp;rdquo;। यह मेमोरी लीक को रोकता है।&lt;/p>
&lt;h3 id="powershell-सइड-म-add-type-और-pinvoke">PowerShell साइड में &lt;code>Add-Type&lt;/code> और P/Invoke
&lt;/h3>&lt;p>C++ DLL (&lt;code>NativeLib.dll&lt;/code>) को संकलित (compile) करने के बाद, हम इसे PowerShell स्क्रिप्ट से कॉल करते हैं। हम &lt;code>Add-Type&lt;/code> का उपयोग करके C# के P/Invoke सिग्नेचर को गतिशील रूप से संकलित (dynamically compile) करते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># PowerShell Script: Invoke-NativeDLL.ps1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$signature&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="sh">@&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">using System;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">using System.Runtime.InteropServices;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">using System.Text;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">public class NativeInterop
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> // C++ का ComputeHeavyTask परिभाषित करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> [DllImport(&amp;#34;NativeLib.dll&amp;#34;, CallingConvention = CallingConvention.StdCall)]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> public static extern int ComputeHeavyTask(int multiplier, int dataSize);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> // C++ का ProcessSystemString परिभाषित करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> [DllImport(&amp;#34;NativeLib.dll&amp;#34;, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> public static extern bool ProcessSystemString(string inputString, StringBuilder outputBuffer, int bufferSize);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">&amp;#39;@&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># C# कोड को PowerShell सत्र में संकलित करें और जोड़ें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Add-Type&lt;/span> &lt;span class="n">-TypeDefinition&lt;/span> &lt;span class="nv">$signature&lt;/span> &lt;span class="n">-PassThru&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. भारी संख्यात्मक गणना (numerical calculation) कॉल&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$result&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">NativeInterop&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">ComputeHeavyTask&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">100000000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Compute Task Result: &lt;/span>&lt;span class="nv">$result&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. स्ट्रिंग प्रसंस्करण कॉल&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$input&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;SYSTEM_NODE_001&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$bufferSize&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="mf">256&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># C++ साइड को लिखने के लिए बफर के रूप में StringBuilder का उपयोग करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$outputBuffer&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-Object&lt;/span> &lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Text&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">StringBuilder&lt;/span> &lt;span class="n">-ArgumentList&lt;/span> &lt;span class="nv">$bufferSize&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$success&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">NativeInterop&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">ProcessSystemString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$input&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$outputBuffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$bufferSize&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$success&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Processed String: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$outputBuffer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">ToString&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;String processing failed.&amp;#34;&lt;/span> &lt;span class="n">-ForegroundColor&lt;/span> &lt;span class="n">Red&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="आरकटकचर-वजअलइजशन">आर्किटेक्चर विज़ुअलाइज़ेशन
&lt;/h3>&lt;p>निम्नलिखित अनुक्रम आरेख (sequence diagram) PowerShell से C++ DLL में कॉलिंग प्रवाह (flow) और मेमोरी एक्सचेंज को दर्शाता है।&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant PS as &amp;#34;PowerShell स्क्रिप्ट&amp;#34;
participant CLR as &amp;#34;.NET CLR (P/Invoke)&amp;#34;
participant CPP as &amp;#34;C++ नेटिव DLL&amp;#34;
PS-&amp;gt;&amp;gt;CLR: &amp;#34;ProcessSystemString कॉल करें&amp;#34;
note right of CLR: &amp;#34;System.String को LPCWSTR में मार्शल करें&amp;#34;
note right of CLR: &amp;#34;StringBuilder संदर्भ पास करें&amp;#34;
CLR-&amp;gt;&amp;gt;CPP: &amp;#34;ProcessSystemString(LPCWSTR, LPWSTR, int)&amp;#34;
CPP-&amp;gt;&amp;gt;CPP: &amp;#34;नेटिव स्ट्रिंग हेरफेर निष्पादित करें&amp;#34;
CPP-&amp;gt;&amp;gt;CPP: &amp;#34;परिणाम को LPWSTR बफर में लिखें&amp;#34;
CPP--&amp;gt;&amp;gt;CLR: &amp;#34;bool लौटाएं (सफलता)&amp;#34;
note left of CLR: &amp;#34;संशोधित StringBuilder बफर पढ़ें&amp;#34;
CLR--&amp;gt;&amp;gt;PS: &amp;#34;निष्पादन नियंत्रण लौटाएं&amp;#34;
PS-&amp;gt;&amp;gt;PS: &amp;#34;संसाधित स्ट्रिंग आउटपुट करें&amp;#34;
&lt;/pre>
&lt;h2 id="c-स-powershell-क-कल-करन">C++ से PowerShell को कॉल करना
&lt;/h2>&lt;p>अब यह विपरीत दृष्टिकोण है। ऐसे मामले हो सकते हैं जहाँ आप गतिशील रूप से (dynamically) C++ में निर्मित सिस्टम सेवा या डेस्कटॉप एप्लिकेशन से PowerShell स्क्रिप्ट को निष्पादित करना चाहते हैं और उसके परिणाम प्राप्त करना चाहते हैं। उदाहरण के लिए, जब कोई C++ मॉनिटरिंग एजेंट किसी विशिष्ट विसंगति (anomaly) का पता लगाता है, तो वह PowerShell की उपचारात्मक स्क्रिप्ट (remediation script) चलाता है।&lt;/p>
&lt;p>दृष्टिकोण मुख्य रूप से दो हैं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>प्रक्रिया प्रारंभ (&lt;code>CreateProcess&lt;/code> / &lt;code>_popen&lt;/code>)&lt;/strong>: &lt;code>powershell.exe&lt;/code> को एक स्वतंत्र प्रक्रिया के रूप में प्रारंभ करना और मानक इनपुट/आउटपुट को पाइप से जोड़ना।&lt;/li>
&lt;li>&lt;strong>PowerShell होस्टिंग API (C++/CLI के माध्यम से)&lt;/strong>: PowerShell रनटाइम को उसी प्रक्रिया के भीतर होस्ट करना।&lt;/li>
&lt;/ol>
&lt;p>इस लेख में, हम सिस्टम प्रोग्रामिंग में सबसे मजबूत और बहुमुखी &lt;strong>पाइपलाइन का उपयोग करके CreateProcess&lt;/strong> विधि के बारे में बताएंगे।&lt;/p>
&lt;h3 id="createprocess-और-अनम-anonymous-पइपस-क-मधयम-स-नषपदन">CreateProcess और अनाम (Anonymous) पाइप्स के माध्यम से निष्पादन
&lt;/h3>&lt;p>निम्नलिखित C++ कोड अनाम पाइप (Anonymous Pipes) बनाता है, &lt;code>powershell.exe&lt;/code> को बाल प्रक्रिया (child process) के रूप में शुरू करके स्क्रिप्ट निष्पादित करता है, और मानक आउटपुट (standard output) से परिणाम पढ़ता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;windows.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">ExecutePowerShellScript&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">script&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">HANDLE&lt;/span> &lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SECURITY_ATTRIBUTES&lt;/span> &lt;span class="n">sa&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sa&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">nLength&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SECURITY_ATTRIBUTES&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sa&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">bInheritHandle&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TRUE&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// पाइप हैंडल को बाल प्रक्रिया में विरासत (inherit) में दें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">sa&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">lpSecurityDescriptor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. पाइप बनाना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">CreatePipe&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">sa&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s">&amp;#34;Error: CreatePipe failed.&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. बाल प्रक्रिया (PowerShell) के स्टार्टअप जानकारी को सेट करना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">STARTUPINFOA&lt;/span> &lt;span class="n">si&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ZeroMemory&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">si&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">STARTUPINFOA&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">cb&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">STARTUPINFOA&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">dwFlags&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">STARTF_USESTDHANDLES&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">STARTF_USESHOWWINDOW&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hStdOutput&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hStdError&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">wShowWindow&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SW_HIDE&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// विंडो छिपाएं
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PROCESS_INFORMATION&lt;/span> &lt;span class="n">pi&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ZeroMemory&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PROCESS_INFORMATION&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// कमांड लाइन का निर्माण (सरलीकृत संस्करण जो बायपास नीति के साथ Base64 एन्कोडिंग आदि से बचता है)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">cmd&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;powershell.exe -NoProfile -NonInteractive -Command &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">script&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">char&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">cmdBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cmd&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">begin&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">cmd&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">end&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cmdBuffer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sc">&amp;#39;\0&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 3. प्रक्रिया बनाना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">CreateProcessA&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cmdBuffer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TRUE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">si&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s">&amp;#34;Error: CreateProcess failed.&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// पैरेंट प्रोसेस (parent process) में राइट पाइप की आवश्यकता नहीं है इसलिए इसे बंद करें (यदि बंद नहीं किया गया, तो Read ब्लॉक हो जाएगा)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 4. परिणाम पढ़ना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">output&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DWORD&lt;/span> &lt;span class="n">bytesRead&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">char&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">4096&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">ReadFile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">bytesRead&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">bytesRead&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">buffer&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">bytesRead&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sc">&amp;#39;\0&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">output&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 5. क्लीनअप
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">WaitForSingleObject&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hProcess&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">INFINITE&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hProcess&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hThread&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// PowerShell में प्रक्रिया सूची प्राप्त करने और CPU उपयोग द्वारा सॉर्ट करने का आदेश
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">psCommand&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 | Format-Table Name, CPU, Id&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Executing PowerShell from C++...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ExecutePowerShellScript&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">psCommand&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Result:&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="windows-रजसटर-और-powershell-क-एककरण">Windows रजिस्ट्री और PowerShell का एकीकरण
&lt;/h3>&lt;p>C++ से स्क्रिप्ट चलाते समय, डायनेमिक कॉन्फ़िगरेशन मानों (dynamic configuration values) या निष्पादन पथों (execution paths) को हार्डकोड करने से बचना चाहिए। कई मामलों में, C++ एप्लिकेशन &lt;strong>Windows रजिस्ट्री&lt;/strong> से सेटिंग्स पढ़ते हैं।&lt;/p>
&lt;p>एंटरप्राइज़ सिस्टम में वह आर्किटेक्चर पसंद किया जाता है जहाँ C++ साइड &lt;code>RegOpenKeyEx&lt;/code> और &lt;code>RegQueryValueEx&lt;/code> का उपयोग करके &lt;code>HKLM\SOFTWARE\MyApp&lt;/code> से PowerShell स्क्रिप्ट का पथ प्राप्त करता है, और इसे उपर्युक्त &lt;code>CreateProcess&lt;/code> में तर्क (argument) के रूप में पास करता है।&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;C++ एजेंट सेवा&amp;#34;] --&amp;gt;|RegQueryValueEx| B[&amp;#34;Windows रजिस्ट्री&amp;#34;]
B --&amp;gt;|Return Script Path| A
A --&amp;gt;|CreateProcess| C[&amp;#34;powershell.exe&amp;#34;]
C --&amp;gt;|Execute| D[&amp;#34;व्यवस्थापक स्क्रिप्ट (उदा., Restart-Service)&amp;#34;]
D --&amp;gt;|stdout via Pipe| C
C --&amp;gt;|ReadFile| A
A --&amp;gt;|Log| E[&amp;#34;इवेंट व्यूअर / लॉग फ़ाइल&amp;#34;]
&lt;/pre>
&lt;h2 id="परदरशन-वशलषण-performance-analysis-और-ऑफलडग-offloading-क-लभ">प्रदर्शन विश्लेषण (Performance Analysis) और ऑफलोडिंग (Offloading) के लाभ
&lt;/h2>&lt;p>हम इस तरह के जटिल आर्किटेक्चर को क्यों अपनाते हैं? एक विशिष्ट परिदृश्य के रूप में, &amp;ldquo;कई गीगाबाइट की कस्टम IIS लॉग फ़ाइलों के पार्सिंग (parsing)&amp;rdquo; पर विचार करें।&lt;/p>
&lt;p>जब आप PowerShell में &lt;code>Get-Content&lt;/code> का उपयोग करते हैं और रेगुलर एक्सप्रेशन (regular expressions) का उपयोग करके इसे पंक्ति-दर-पंक्ति पार्स करते हैं, तो ऑब्जेक्ट निर्माण और कचरा संग्रहण (Garbage Collection: GC) के ओवरहेड के कारण CPU समय की बड़ी मात्रा का उपभोग होता है।&lt;/p>
&lt;p>स्क्रिप्ट निष्पादन में मेमोरी आवंटन संख्या $A$ और GC ट्रिगर संख्या $G$ निम्नानुसार अनुपातिक (proportional) हैं:&lt;/p>
$$ G \propto \sum_{i=1}^{N} A_i $$&lt;p>जब प्रसंस्करण को C++ नेटिव कोड में स्थानांतरित (offload) किया जाता है, तो मेमोरी मैपिंग (&lt;code>CreateFileMapping&lt;/code>, &lt;code>MapViewOfFile&lt;/code>) का उपयोग पूरी फ़ाइल को सीधे मेमोरी में विस्तारित करने के लिए किया जा सकता है, और पॉइंटर अंकगणित (pointer arithmetic) द्वारा जीरो-कॉपी (Zero-copy) के साथ स्ट्रिंग खोज की जा सकती है। इस मामले में, ऑब्जेक्ट निर्माण से जुड़ा ओवरहेड वस्तुतः शून्य हो जाता है, और पार्सिंग सैद्धांतिक मेमोरी बैंडविड्थ सीमा के करीब की गति से पूरी होती है।&lt;/p>
&lt;p>पार्स किए गए परिणामों (जैसे: अनधिकृत पहुँच वाले IP पतों की सूची) को केवल PowerShell साइड पर वापस करने से, P/Invoke मार्शलिंग लागतों को भी न्यूनतम किया जा सकता है।&lt;/p>
&lt;h2 id="वयवहरक-ससटम-परबधन-सवचलन-परदशय">व्यावहारिक सिस्टम प्रबंधन स्वचालन परिदृश्य
&lt;/h2>&lt;h3 id="परदशय-1-उचच-गत-फइल-ससटम-सकन-और-अनमत-permission-परवरतन">परिदृश्य 1: उच्च गति फ़ाइल सिस्टम स्कैन और अनुमति (Permission) परिवर्तन
&lt;/h3>&lt;p>बड़े पैमाने पर फ़ाइल सर्वर में, यह एक ऐसा कार्य है जहाँ विशिष्ट एक्सटेंशन वाली फ़ाइलों को निकाला जाता है जिनमें विशिष्ट ACL (एक्सेस कंट्रोल लिस्ट) सेट होती है, और फिर बैच (batch) में उनकी अनुमतियों (permissions) को बदला जाता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>C++ की भूमिका&lt;/strong>: &lt;code>FindFirstFile&lt;/code> / &lt;code>FindNextFile&lt;/code> और मल्टीथ्रेडिंग का उपयोग करके बहुत तेज़ गति से निर्देशिका ट्री (directory tree) को पार (traverse) करना और शर्तों से मेल खाने वाले फ़ाइल पथों की एक सूची तैयार करना।&lt;/li>
&lt;li>&lt;strong>PowerShell की भूमिका&lt;/strong>: C++ से प्राप्त सूची पर बैच में अनुमतियों को लागू करने के लिए &lt;code>Set-Acl&lt;/code> का उपयोग करना (या Active Directory के साथ एकीकृत प्रक्रिया)।&lt;/li>
&lt;/ul>
&lt;h3 id="परदशय-2-अदवतय-unique-हरडवयर-जनकर-एकतर-करन">परिदृश्य 2: अद्वितीय (Unique) हार्डवेयर जानकारी एकत्र करना
&lt;/h3>&lt;p>विशिष्ट हार्डवेयर उपकरणों (जैसे: विशेष PCIe कार्ड या सेंसर) की जानकारी की निगरानी करना जिसे WMI (Windows Management Instrumentation) या CIM (Common Information Model) के माध्यम से प्राप्त नहीं किया जा सकता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>C++ की भूमिका&lt;/strong>: एक DLL जो डिवाइस ड्राइवर को &lt;code>DeviceIoControl&lt;/code> कॉल करता है और बाइनरी डेटा प्राप्त और विश्लेषण करता है।&lt;/li>
&lt;li>&lt;strong>PowerShell की भूमिका&lt;/strong>: नियमित रूप से DLL को कॉल करना, विश्लेषण परिणामों को JSON में फ़ॉर्मेट करना और इसे मॉनिटरिंग सर्वर के REST API पर भेजना।&lt;/li>
&lt;/ul>
&lt;h2 id="ममर-परबधन-और-समसय-नवरण-troubleshooting-क-सरवततम-अभयस">मेमोरी प्रबंधन और समस्या निवारण (Troubleshooting) के सर्वोत्तम अभ्यास
&lt;/h2>&lt;p>एकीकरण (integration) में सबसे अधिक होने वाले बग &lt;strong>मेमोरी लीक&lt;/strong> और &lt;strong>एक्सेस उल्लंघन (Access Violation: 0xC0000005)&lt;/strong> हैं।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>पॉइंटर की वैधता अवधि&lt;/strong>: जब PowerShell की ओर से &lt;code>[ref]&lt;/code> या &lt;code>StringBuilder&lt;/code> पास किया जाता है, तो P/Invoke केवल कॉल के दौरान उस मेमोरी को पिन (Pin) करता है। C++ पक्ष पर, आपको उस पॉइंटर को वैश्विक चर (global variable) में सहेजकर बाद में एक्सेस नहीं करना चाहिए। अतुल्यकालिक कॉलबैक (asynchronous callbacks) करते समय, आपको &lt;code>GCHandle&lt;/code> का उपयोग करके मेमोरी को स्पष्ट रूप से पिन करना चाहिए।&lt;/li>
&lt;li>&lt;strong>64-बिट वातावरण में पॉइंटर का आकार&lt;/strong>: आधुनिक Windows मूल रूप से 64-बिट (x64) है। C++ साइड में पॉइंटर का आकार 8 बाइट्स होता है, इसलिए आपको PowerShell (.NET) साइड पर &lt;code>IntPtr&lt;/code> का उपयोग करना चाहिए। चूँकि C++ का &lt;code>long&lt;/code> Windows में 4 बाइट्स का होता है, इसलिए पुराने कोड जहाँ पॉइंटर को &lt;code>long&lt;/code> में कास्ट करके पास किया जाता है, क्रैश का कारण बन सकते हैं।&lt;/li>
&lt;li>&lt;strong>स्ट्रिंग एन्कोडिंग बेमेल (Mismatch)&lt;/strong>: PowerShell आंतरिक रूप से UTF-16 का उपयोग करता है। यदि आप इसे C++ साइड में ANSI स्ट्रिंग (&lt;code>std::string&lt;/code>, &lt;code>char*&lt;/code>) के रूप में प्राप्त करने का प्रयास करते हैं, तो टेक्स्ट विकृत (garbled) हो जाएगा। हमेशा वाइड स्ट्रिंग (&lt;code>std::wstring&lt;/code>, &lt;code>wchar_t*&lt;/code>) का उपयोग करें, और सुनिश्चित करें कि P/Invoke साइड पर &lt;code>CharSet = CharSet.Unicode&lt;/code> निर्दिष्ट किया गया है।&lt;/li>
&lt;/ol>
&lt;h2 id="नषकरष">निष्कर्ष
&lt;/h2>&lt;p>PowerShell और C++ का एकीकरण सिस्टम प्रबंधन स्वचालन में एक शक्तिशाली संयोजन है जो एक स्क्रिप्टिंग भाषा की सरलता को एक नेटिव भाषा की शक्ति के साथ संतुलित करता है।&lt;/p>
&lt;p>P/Invoke का उपयोग करके C++ DLL को कॉल करके, आप गणना-गहन (compute-intensive) कार्यों को ऑफलोड कर सकते हैं और निष्पादन समय को नाटकीय रूप से कम कर सकते हैं। इसके विपरीत, C++ एप्लिकेशन से प्रक्रिया प्रारंभ (process start) या पाइपलाइनों के माध्यम से PowerShell के समृद्ध सिस्टम प्रबंधन मॉड्यूल का उपयोग करके, आप विकास लागतों को काफी कम कर सकते हैं।&lt;/p>
&lt;p>यद्यपि सीमाओं (boundaries) पर मेमोरी प्रबंधन और स्ट्रिंग रूपांतरण पर ध्यान देने की आवश्यकता है, इस लेख में पेश किए गए आर्किटेक्चर पैटर्न और कार्यान्वयन तकनीकों में महारत हासिल करके, आप अधिक उन्नत और मजबूत Windows सिस्टम प्रबंधन उपकरण बनाने में सक्षम होंगे।&lt;/p>
&lt;hr>
&lt;p>&lt;em>इस तकनीकी ब्लॉग में, हम भविष्य में Windows आंतरिक संरचना और उन्नत स्वचालन से संबंधित गहन विषयों को कवर करना जारी रखेंगे। यदि आपके कोई प्रश्न या प्रतिक्रिया है, तो कृपया उन्हें टिप्पणी अनुभाग (comment section) में छोड़ दें।&lt;/em>&lt;/p></description></item><item><title>तकनीकी ब्लॉग पर मासिक विज़िटर्स बढ़ाने के लिए इंजीनियरों को क्या करना चाहिए</title><link>http://kenji.blog/hi/p/tech-blog-growth-strategies-for-engineers/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/tech-blog-growth-strategies-for-engineers/</guid><description>&lt;img src="http://kenji.blog/p/tech-blog-growth-strategies-for-engineers/img/eyecatch.jpg" alt="Featured image of post तकनीकी ब्लॉग पर मासिक विज़िटर्स बढ़ाने के लिए इंजीनियरों को क्या करना चाहिए" />&lt;h2 id="परचय-टक-बलग-क-गरथ-हक-ज-कवल-एक-इजनयर-ह-कर-सकत-ह">परिचय: टेक ब्लॉग का ग्रोथ हैक जो केवल एक इंजीनियर ही कर सकता है
&lt;/h2>&lt;p>कई सॉफ़्टवेयर इंजीनियर तकनीकी ब्लॉग शुरू करते हैं, लेकिन ऐसे बहुत कम मामले होते हैं जहां वे एक निश्चित मात्रा में ट्रैफ़िक इकट्ठा कर पाते हैं और उसे लंबे समय तक बनाए रख पाते हैं या बढ़ा पाते हैं। उच्च गुणवत्ता वाले तकनीकी लेख लिखना एक बुनियादी शर्त है, लेकिन वह युग अब समाप्त हो गया है जब &amp;ldquo;अच्छा लेख लिखने से लोग उसे स्वाभाविक रूप से पढ़ेंगे&amp;rdquo;। आधुनिक सर्च इंजन एल्गोरिदम जटिल हो गए हैं, और सोशल मीडिया पर सूचनाओं का प्रवाह पहले से कहीं अधिक तेज़ हो गया है।&lt;/p>
&lt;p>हालाँकि, इंजीनियरों के पास ऐसी ताकतें हैं जो अन्य पेशों में नहीं हैं। वह है &amp;ldquo;सिस्टम आर्किटेक्चर को समझना, टूल्स को मिलाकर प्रक्रियाओं को स्वचालित करना, और प्रोग्राम के माध्यम से डेटा का विश्लेषण करने में सक्षम होना।&amp;rdquo; यह लेख केवल लेखन तकनीकों तक सीमित नहीं है, बल्कि तकनीकी ब्लॉग को एक &amp;ldquo;प्रोडक्ट&amp;rdquo; के रूप में देखता है, और इंजीनियरिंग की शक्ति का उपयोग करके मासिक ट्रैफ़िक को नाटकीय रूप से बढ़ाने की रणनीतियों को अत्यंत विस्तृत और व्यावहारिक रूप से समझाता है।&lt;/p>
&lt;hr>
&lt;h2 id="1-इजनयर-क-तकनक-बलग-क-लए-एसईओ-seo-आरकटकचर">1. इंजीनियरों के तकनीकी ब्लॉग के लिए एसईओ (SEO) आर्किटेक्चर
&lt;/h2>&lt;p>ब्लॉग का आधार बनने वाला सिस्टम (जैसे कि स्टैटिक साइट जेनरेटर) और HTML की संरचना सबसे महत्वपूर्ण तत्व हैं जो सर्च इंजन को कंटेंट की सही ढंग से व्याख्या करने में मदद करते हैं।&lt;/p>
&lt;h3 id="11-core-web-vitals-क-अनकलन-optimization">1.1 Core Web Vitals का अनुकूलन (Optimization)
&lt;/h3>&lt;p>Google पेज एक्सपीरियंस को रैंकिंग फैक्टर के रूप में उपयोग करता है, और विशेष रूप से &lt;strong>Core Web Vitals (LCP, FID/INP, CLS)&lt;/strong> को तकनीकी ब्लॉग में भी नज़रअंदाज़ नहीं किया जा सकता है।
तकनीकी ब्लॉग में, बड़ी संख्या में सोर्स कोड ब्लॉक, गणितीय सूत्र (MathJax / KaTeX) और इलस्ट्रेटिव इमेजेस का बहुत अधिक उपयोग किया जाता है। ये कारक पेज की रेंडरिंग में देरी कर सकते हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>LCP (Largest Contentful Paint)&lt;/strong>: पहले व्यू (First View) में मुख्य कंटेंट की लोडिंग स्पीड। आईकैच (eyecatch) इमेजेस के लिए WebP या AVIF का उपयोग करें और उन्हें प्रीलोड करने के लिए &lt;code>fetchpriority=&amp;quot;high&amp;quot;&lt;/code> एट्रिब्यूट (attribute) जोड़ें। साथ ही, सिंटैक्स हाइलाइटिंग के लिए भारी CSS और JS को एसिंक्रोनस रूप से लोड करें या उन्हें केवल उन पेजों पर लोड करने के लिए डिज़ाइन करें जहाँ उनकी आवश्यकता हो।&lt;/li>
&lt;li>&lt;strong>CLS (Cumulative Layout Shift)&lt;/strong>: लेख लोड होते समय लेआउट का खिसकना। गणितीय सूत्रों या इमेजेस के लिए डिस्प्ले एरिया को पहले से CSS &lt;code>aspect-ratio&lt;/code> आदि के साथ सुरक्षित करके, बाद में DOM सम्मिलित किए जाने पर होने वाले झटके (Layout shift) को रोका जा सकता है।&lt;/li>
&lt;li>&lt;strong>INP (Interaction to Next Paint)&lt;/strong>: यूज़र के इंटरेक्शन पर प्रतिक्रिया। भारी JavaScript (जैसे क्लाइंट-साइड पर डायनामिक फुल-टेक्स्ट सर्च या भारी Markdown पार्सर का निष्पादन) को मेन थ्रेड पर चलाने के बजाय, इसे Web Worker पर ऑफलोड करना या बिल्ड के समय स्टैटिक HTML (SSG) के रूप में जेनरेट करना अनिवार्य है।&lt;/li>
&lt;/ul>
&lt;h3 id="12-सटरकचरड-डट-json-ld-क-करयनवयन-implementation">1.2 स्ट्रक्चर्ड डेटा (JSON-LD) का कार्यान्वयन (Implementation)
&lt;/h3>&lt;p>सर्च इंजन को स्पष्ट रूप से यह बताने के लिए कि पेज एक &amp;ldquo;लेख (article)&amp;rdquo; है और इसका लेखक &amp;ldquo;कौन&amp;rdquo; है, JSON-LD फॉर्मेट का उपयोग करके स्ट्रक्चर्ड डेटा लागू करें। &lt;code>TechArticle&lt;/code> या &lt;code>SoftwareSourceCode&lt;/code> जैसी स्कीमा का उपयोग करके, Google के रिच रिज़ल्ट्स (Rich Results) में प्रदर्शित होने की संभावना बढ़ जाती है, जिससे CTR (क्लिक-थ्रू रेट) में सुधार होता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;application/ld+json&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@context&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://schema.org&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;TechArticle&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;headline&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;तकनीकी ब्लॉग पर मासिक विज़िटर्स बढ़ाने के लिए इंजीनियरों को क्या करना चाहिए&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;image&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://example.com/img/eyecatch.jpg&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;datePublished&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;2026-09-14T10:00:00+09:00&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;author&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Kenji&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://example.com/about/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;publisher&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Organization&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Kenji&amp;#39;s Tech Blog&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;logo&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;ImageObject&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://example.com/img/logo.png&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="13-समटक-html-और-डकयमट-सटरकचर-क-अनकलन">1.3 सिमेंटिक HTML और डॉक्यूमेंट स्ट्रक्चर का अनुकूलन
&lt;/h3>&lt;p>हेडिंग्स (&lt;code>h1&lt;/code> से &lt;code>h6&lt;/code>) की उचित नेस्टिंग (nesting) सबसे बुनियादी बातों में से एक है, लेकिन तकनीकी ब्लॉगों में HTML5 सिमेंटिक टैग्स जैसे &lt;code>article&lt;/code>, &lt;code>section&lt;/code>, &lt;code>aside&lt;/code> और &lt;code>nav&lt;/code> का सटीक रूप से उपयोग करना आवश्यक है। इसके अतिरिक्त, सोर्स कोड को इंगित करने के लिए &lt;code>&amp;lt;code&amp;gt;&lt;/code> और &lt;code>&amp;lt;pre&amp;gt;&lt;/code>, कीबोर्ड इनपुट के लिए &lt;code>&amp;lt;kbd&amp;gt;&lt;/code>, और वेरिएबल्स के लिए &lt;code>&amp;lt;var&amp;gt;&lt;/code> का सही ढंग से उपयोग करके, आप मशीन-रीडेबल HTML प्रदान कर सकते हैं। यह AI द्वारा कंटेंट इंडेक्सिंग (जैसे LLM ट्रेनिंग डेटा कलेक्शन और RAG सिस्टम) के लिए भी एक बहुत ही प्रभावी साधन है।&lt;/p>
&lt;hr>
&lt;h2 id="2-सरच-इटट-search-intent-क-मनवजञन-और-कवरड-रणनत">2. सर्च इंटेंट (Search Intent) का मनोविज्ञान और कीवर्ड रणनीति
&lt;/h2>&lt;p>सर्च इंजनों (ऑर्गेनिक ट्रैफ़िक) से आने वाले ट्रैफ़िक को अधिकतम करने के लिए, आपको यूज़र के सर्च इंटेंट को सटीक रूप से समझना होगा कि &amp;ldquo;उन्होंने उस कीवर्ड से सर्च क्यों किया।&amp;rdquo; तकनीकी सर्च इंटेंट को मोटे तौर पर दो श्रेणियों में बांटा जा सकता है।&lt;/p>
&lt;h3 id="21-तरट-समधन-error-resolution-परकर-और-वयवसथत-शकषणसमकष-systematic-learningreview-परकर">2.1 &amp;ldquo;त्रुटि समाधान (Error Resolution) प्रकार&amp;rdquo; और &amp;ldquo;व्यवस्थित शिक्षण/समीक्षा (Systematic Learning/Review) प्रकार&amp;rdquo;
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>त्रुटि समाधान प्रकार (Troubleshooting Intent)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>सर्च कीवर्ड के उदाहरण: &lt;code>Docker &amp;quot;no space left on device&amp;quot; समाधान&lt;/code>, &lt;code>Python IndexError list index out of range कारण&lt;/code>&lt;/li>
&lt;li>मनोविज्ञान: डेवलपमेंट के दौरान किसी एरर के कारण काम रुक गया है, और वे तुरंत एक त्वरित समाधान देने वाले कमांड या कोड स्निपेट (snippet) की तलाश में हैं।&lt;/li>
&lt;li>रणनीति: लेख की शुरुआत में (फर्स्ट व्यू में) &amp;ldquo;निष्कर्ष (समाधान के लिए कोड या कमांड)&amp;rdquo; प्रस्तुत करें। पृष्ठभूमि और विस्तृत तंत्र की व्याख्या को उसके बाद रखें, जिससे यूज़र की &amp;ldquo;इसे तुरंत ठीक करने&amp;rdquo; की इच्छा पहले पूरी हो सके। इससे बाउंस रेट (Bounce rate) कम किया जा सकता है।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>व्यवस्थित शिक्षण/समीक्षा प्रकार (Learning &amp;amp; Review Intent)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>सर्च कीवर्ड के उदाहरण: &lt;code>React vs Vue 2026 तुलना&lt;/code>, &lt;code>Rust एसिंक्रोनस प्रोसेसिंग (Asynchronous processing) परिचय&lt;/code>, &lt;code>GCP नेटवर्क आर्किटेक्चर डिज़ाइन&lt;/code>&lt;/li>
&lt;li>मनोविज्ञान: किसी नए तकनीकी स्टैक (tech stack) का चयन करना चाहते हैं या बुनियादी बातों से अपनी समझ को गहरा करना चाहते हैं, और पढ़ने में समय बिताने के लिए तैयार हैं।&lt;/li>
&lt;li>रणनीति: विषय सूची (TOC) को समृद्ध करें और इलस्ट्रेशन (illustrations) या आर्किटेक्चर आरेखों (जैसे Mermaid) का अधिक उपयोग करें। फायदे और नुकसान की निष्पक्ष रूप से तुलना करें, और यह शामिल करें कि वास्तविक कार्य में इसका उपयोग कैसे किया जा सकता है (use cases), जिससे पेज पर बिताया गया समय बढ़ाया जा सके।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="22-टरफक-क-एकसपनशयल-डक-exponential-decay-मडल-और-लनग-टल-long-tail-रणनत">2.2 ट्रैफ़िक का एक्सपोनेंशियल डेके (Exponential Decay) मॉडल और लॉन्ग-टेल (Long-Tail) रणनीति
&lt;/h3>&lt;p>तकनीकी लेखों के ट्रैफ़िक में अक्सर पब्लिश होने के तुरंत बाद सोशल मीडिया आदि पर वायरल (buzz) होने के कारण अचानक उछाल (spike) आता है, और फिर यह घातांकीय (exponential) रूप से कम होने लगता है। इस ट्रैफ़िक $V(t)$ का अनुमान निम्नलिखित गणितीय मॉडल द्वारा लगाया जा सकता है:&lt;/p>
$$ V(t) = V_0 e^{-\lambda t} + C $$&lt;p>जहाँ:&lt;/p>
&lt;ul>
&lt;li>$V(t)$: समय $t$ पर ट्रैफ़िक की मात्रा&lt;/li>
&lt;li>$V_0$: पब्लिश होने के तुरंत बाद सोशल मीडिया बज़ आदि के कारण प्रारंभिक ट्रैफ़िक का उछाल&lt;/li>
&lt;li>$\lambda$: कंटेंट के पुराने होने या सोशल मीडिया पर भूल जाने के कारण क्षय स्थिरांक (Decay constant) (तकनीक के ट्रेंड परिवर्तन की गति पर निर्भर करता है)&lt;/li>
&lt;li>$C$: सर्च इंजन से आने वाला स्थिर ऑर्गेनिक ट्रैफ़िक (बेसलाइन ट्रैफ़िक)&lt;/li>
&lt;/ul>
&lt;p>लंबे समय तक ट्रैफ़िक बढ़ाने की कुंजी अस्थायी बज़ ($V_0$) का लक्ष्य रखने के बजाय इस बात पर निर्भर करती है कि &lt;strong>स्थिरांक $C$ (सर्च इंजन से लगातार आने वाला ट्रैफ़िक) को कितना बढ़ाया जाए&lt;/strong>। विशिष्ट आला (niche) एरर्स या विशिष्ट टूल्स को एक साथ जोड़ने के तरीकों जैसे &amp;ldquo;लॉन्ग-टेल कीवर्ड्स&amp;rdquo; (जिनका सर्च वॉल्यूम कम हो सकता है लेकिन कोई प्रतिस्पर्धा नहीं होती) को बड़ी संख्या में कवर करके, $C$ के योग को एक विशाल ट्रैफ़िक स्रोत में विकसित किया जा सकता है।&lt;/p>
&lt;hr>
&lt;h2 id="3-google-search-console-api-क-उपयग-करक-डट-डरवन-data-driven-कटट-वशलषण">3. Google Search Console API का उपयोग करके डेटा-ड्रिवन (Data-Driven) कंटेंट विश्लेषण
&lt;/h2>&lt;p>एक स्थिर ट्रैफ़िक आधार $C$ बनाने के लिए, आपको Google Search Console (GSC) के डेटा का उपयोग करके निष्पक्ष रूप से यह विश्लेषण करने की आवश्यकता है कि &amp;ldquo;Google आपके कंटेंट का मूल्यांकन कैसे कर रहा है।&amp;rdquo; हालांकि, GSC के वेब यूआई (Web UI) पर मैन्युअल क्लिक करने की अपनी सीमाएँ हैं। एक इंजीनियर के रूप में, GSC API और पायथन (Python) का उपयोग करके इस विश्लेषण को स्वचालित (automate) करें।&lt;/p>
&lt;h3 id="31-gsc-api-और-पयथन-python-क-सथ-ऑटमशन-एपरच-automation-approach">3.1 GSC API और पायथन (Python) के साथ ऑटोमेशन एप्रोच (Automation Approach)
&lt;/h3>&lt;p>एक ऐसी स्क्रिप्ट बनाएं जो स्वचालित रूप से यह पता लगाए कि किसी विशिष्ट लेख की सर्च रैंकिंग समय के साथ कैसे गिर रही है (Decaying Content), या ऐसे &amp;ldquo;व्यर्थ जा रहे लेखों&amp;rdquo; का पता लगाए जिनकी इंप्रेशन (Impression) संख्या अधिक है लेकिन क्लिक-थ्रू रेट (CTR) असामान्य रूप से कम है।
इसके लिए &lt;code>google-api-python-client&lt;/code> और &lt;code>pandas&lt;/code> का उपयोग किया जाता है।&lt;/p>
&lt;h3 id="32-पयथन-इमपलमटशन-कड-कम-ctr-वल-कटट-क-सवचलत-नषकरषण">3.2 पायथन इम्प्लीमेंटेशन कोड: कम CTR वाले कंटेंट का स्वचालित निष्कर्षण
&lt;/h3>&lt;p>नीचे एक स्क्रिप्ट का उदाहरण दिया गया है जो API से पिछले 30 दिनों का सर्च परफॉर्मेंस डेटा प्राप्त करता है, और उन &amp;ldquo;कीवर्ड और लेख URLs को निकालता है जिनके शीर्षक और विवरण (description) में सुधार की काफी गुंजाइश है&amp;rdquo;, जहां इंप्रेशन 1000 से अधिक हैं और CTR 2% से कम है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">google.oauth2&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">service_account&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">googleapiclient.discovery&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. प्रमाणीकरण और API सर्विस का निर्माण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">KEY_FILE_LOCATION&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;path/to/your-service-account-key.json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SCOPES&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;https://www.googleapis.com/auth/webmasters.readonly&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SITE_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://your-tech-blog.com/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">credentials&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">service_account&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Credentials&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_service_account_file&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">KEY_FILE_LOCATION&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">scopes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">SCOPES&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">webmasters_service&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">build&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;searchconsole&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;v1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">credentials&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">credentials&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. अनुरोध अवधि की गणना (पिछले 30 दिन)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">today&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">date&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">today&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">end_date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">today&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">days&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">start_date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">today&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">days&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. API अनुरोध निष्पादित करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;startDate&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">start_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;endDate&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">end_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;dimensions&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;query&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;page&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;rowLimit&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">5000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">webmasters_service&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">searchanalytics&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">siteUrl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">SITE_URL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">body&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">execute&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. Pandas DataFrame का उपयोग करके डेटा प्रोसेसिंग और फ़िल्टरिंग&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="s1">&amp;#39;rows&amp;#39;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rows&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;rows&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">row&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">rows&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Query&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;keys&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;URL&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;keys&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Clicks&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;clicks&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Impressions&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;impressions&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;CTR&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;ctr&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Position&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;position&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># फ़िल्टरिंग शर्तें: इंप्रेशन 1000 से अधिक और CTR 2% से कम&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;Impressions&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;CTR&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mf">0.02&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># पोजीशन के आधार पर आरोही क्रम में सॉर्ट करें (जिनकी रैंकिंग अधिक है लेकिन क्लिक नहीं हो रहे हैं, उन्हें प्राथमिकता दें)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sort_values&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">by&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;Position&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ascending&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;【शीर्षक/मेटा डिस्क्रिप्शन में सुधार के लिए अनुशंसित सूची】&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># आवश्यकतानुसार CSV आउटपुट आदि&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># target_df.to_csv(&amp;#39;improve_candidates.csv&amp;#39;, index=False)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;डेटा नहीं मिला।&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस स्क्रिप्ट को cron या GitHub Actions के शेड्यूल्ड जॉब के रूप में चलाकर, आप हमेशा डेटा-आधारित निर्णय ले सकते हैं कि &amp;ldquo;किस लेख के शीर्षक को फिर से लिखा जाना चाहिए।&amp;rdquo; केवल अंतर्ज्ञान (intuition) पर निर्भर रहने के बजाय, डेटा पर आधारित निरंतर सुधार (Continuous Content Improvement - एक तरह का CI/CD) बहुत महत्वपूर्ण है।&lt;/p>
&lt;hr>
&lt;h2 id="4-लख-क-जवनचकर-परबधन-lifecycle-management-और-ररइट-रणनत-rewrite-strategy">4. लेख का जीवनचक्र प्रबंधन (Lifecycle Management) और रीराइट रणनीति (Rewrite Strategy)
&lt;/h2>&lt;p>तकनीकी लेख केवल पब्लिश करने के बाद समाप्त नहीं हो जाते। प्रौद्योगिकी के विकास (फ्रेमवर्क वर्ज़न अपडेट, API के अप्रचलित (deprecated) होने आदि) के साथ, कंटेंट बहुत तेज़ी से पुराना हो जाता है। पुरानी जानकारी प्रदान करना जारी रखने से न केवल ब्लॉग की विश्वसनीयता कम होती है, बल्कि इसका एसईओ (SEO) पर भी नकारात्मक प्रभाव पड़ता है।&lt;/p>
&lt;h3 id="41-कटट-जवनचकर-परबधन-गट-चरट">4.1 कंटेंट जीवनचक्र प्रबंधन (गैंट चार्ट)
&lt;/h3>&lt;p>यहाँ Mermaid गैंट चार्ट (Gantt Chart) का उपयोग करके कंटेंट संचालन का एक आदर्श जीवनचक्र दर्शाया गया है।&lt;/p>
&lt;pre class="mermaid">
gantt
title डेटा-ड्रिवन कंटेंट जीवनचक्र प्रबंधन
dateFormat YYYY-MM-DD
axisFormat %m/%d
section &amp;#34;चरण 1: योजना और लेखन&amp;#34;
&amp;#34;सर्च कीवर्ड और ट्रेंड विश्लेषण&amp;#34; :a1, 2026-09-01, 3d
&amp;#34;ड्राफ्ट और कोड सत्यापन&amp;#34; :a2, after a1, 5d
&amp;#34;संशोधन और प्रूफ़रीडिंग&amp;#34; :a3, after a2, 2d
section &amp;#34;चरण 2: प्रकाशन और प्रचार&amp;#34;
&amp;#34;CI/CD पाइपलाइन के माध्यम से डिप्लॉयमेंट&amp;#34; :p1, 2026-09-11, 1d
&amp;#34;स्वचालित SNS वितरण (X, LinkedIn, RSS)&amp;#34; :p2, 2026-09-11, 1d
&amp;#34;Hatena बुकमार्क आदि पर प्रसार&amp;#34; :p3, after p2, 3d
section &amp;#34;चरण 3: अवलोकन और विश्लेषण&amp;#34;
&amp;#34;GSC डेटा संचय अवधि&amp;#34; :m1, 2026-09-14, 28d
&amp;#34;पायथन API के साथ परफॉरमेंस मूल्यांकन&amp;#34;:m2, after m1, 2d
section &amp;#34;चरण 4: सुधार (रीराइट)&amp;#34;
&amp;#34;कम CTR वाले लेखों का शीर्षक सुधार&amp;#34; :r1, after m2, 3d
&amp;#34;नवीनतम वर्ज़न में कोड अपडेट&amp;#34;:r2, after r1, 4d
&lt;/pre>
&lt;p>इस प्रकार, लेख निर्माण को एक सॉफ़्टवेयर डेवलपमेंट प्रोजेक्ट की तरह मानना, और रिलीज़ के बाद के संचालन और रखरखाव (रीराइट) चरण को योजना में शामिल करना, ट्रैफ़िक को बनाए रखने और सुधारने का रहस्य है।&lt;/p>
&lt;h3 id="42-कटट-नरमण-क-roi-रटरन-ऑन-इनवसटमट-क-गणतय-मडल">4.2 कंटेंट निर्माण के ROI (रिटर्न ऑन इन्वेस्टमेंट) का गणितीय मॉडल
&lt;/h3>&lt;p>चूंकि एक इंजीनियर लेख लिखने के लिए अपना कीमती समय लगाता है, इसलिए उसे इसके रिटर्न ऑन इन्वेस्टमेंट (ROI) के प्रति जागरूक होना चाहिए।
ब्लॉग के लिए ROI को इस प्रकार सूत्रबद्ध किया जा सकता है:&lt;/p>
$$ ROI = \frac{\sum_{t=1}^{T} \left( Rev_{ad}(t) + Val_{brand}(t) + Val_{skill}(t) \right) - Cost_{time}}{\text{Cost}_{time}} \times 100 \ (\%) $$&lt;ul>
&lt;li>$T$: लेख का प्रभावी जीवनकाल (पुराना होने तक का समय)&lt;/li>
&lt;li>$Rev_{ad}(t)$: विज्ञापन आय, एफिलिएट आय, और प्रायोजन (sponsorship) से प्रत्यक्ष राजस्व&lt;/li>
&lt;li>$Val_{brand}(t)$: तकनीकी कौशल दिखाने के कारण करियर पर सकारात्मक प्रभाव का मौद्रिक मूल्य (जैसे जॉब बदलते समय अधिक वेतन प्रस्ताव, व्याख्यान के निमंत्रण आदि)&lt;/li>
&lt;li>$Val_{skill}(t)$: लेख लिखने के लिए सीखने और शोध करने से आपके स्वयं के कौशल में होने वाले सुधार का मूल्य&lt;/li>
&lt;li>$Cost_{time}$: लेख लिखने, चित्र बनाने और कोड को सत्यापित करने में लगने वाला समय (आपके अपने प्रति-घंटे वेतन के बराबर)&lt;/li>
&lt;/ul>
&lt;p>तकनीकी ब्लॉगों के बारे में सबसे अच्छी बात यह है कि भले ही $Rev_{ad}$ कम हो, $Val_{brand}$ और $Val_{skill}$ बहुत अधिक होने की प्रवृत्ति होती है। विशेष रूप से, एक उच्च गुणवत्ता वाली तकनीकी व्याख्या सीधे आपके पोर्टफोलियो (portfolio) के रूप में कार्य करती है और जॉब सर्च या साइड जॉब्स पाने में अत्यधिक प्रभावी होती है।&lt;/p>
&lt;hr>
&lt;h2 id="5-github-actions-और-बहर-ऑटमशन-टलस-क-एककरण-क-मधयम-स-वतरण-distribution">5. GitHub Actions और बाहरी ऑटोमेशन टूल्स के एकीकरण के माध्यम से वितरण (Distribution)
&lt;/h2>&lt;p>एक बार कंटेंट बन जाने के बाद, चुनौती यह है कि इसे लक्ष्य दर्शकों तक कुशलतापूर्वक कैसे पहुँचाया जाए (वितरण)। हर बार मैन्युअल रूप से विभिन्न SNS पर लिंक पोस्ट करना अक्षम है, और यह एक इंजीनियर के काम करने के तरीके के अनुकूल नहीं है।&lt;/p>
&lt;h3 id="51-सशल-मडय-शयरग-क-ऑटमशन-आरकटकचर">5.1 सोशल मीडिया शेयरिंग का ऑटोमेशन आर्किटेक्चर
&lt;/h3>&lt;p>एक ऐसा आर्किटेक्चर बनाएं जो Markdown फ़ाइल को GitHub रिपॉजिटरी की main ब्रांच में मर्ज करने के क्षण से ही बिल्ड, डिप्लॉयमेंट और कई प्लेटफ़ॉर्म्स पर घोषणाओं को पूरी तरह से स्वचालित कर दे।&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;डेवलपर (Git Push)&amp;#34;] --&amp;gt; B[&amp;#34;GitHub रिपॉजिटरी&amp;#34;]
B --&amp;gt;|वेबहुक| C[&amp;#34;GitHub Actions (CI/CD)&amp;#34;]
C --&amp;gt;|बिल्ड| D[&amp;#34;स्टैटिक साइट जेनरेटर (Hugo/Gatsby)&amp;#34;]
D --&amp;gt;|डिप्लॉय| E[&amp;#34;होस्टिंग (Vercel / Cloudflare Pages)&amp;#34;]
D --&amp;gt;|जेनरेट| F[&amp;#34;RSS फ़ीड (index.xml)&amp;#34;]
F --&amp;gt;|पोल किया गया| G[&amp;#34;Zapier / IFTTT / Make&amp;#34;]
G --&amp;gt;|API कॉल| H[&amp;#34;X (Twitter) ऑटो पोस्ट&amp;#34;]
G --&amp;gt;|API कॉल| I[&amp;#34;LinkedIn आर्टिकल पोस्ट&amp;#34;]
G --&amp;gt;|API कॉल| J[&amp;#34;Discord / Slack कम्युनिटी वेबहुक&amp;#34;]
C --&amp;gt;|एक्शन्स स्क्रिप्ट| K[&amp;#34;Qiita / Zenn क्रॉस-पोस्ट API&amp;#34;]
&lt;/pre>
&lt;h3 id="52-ऑटमशन-पइपलइन-बनन-क-मखय-बद">5.2 ऑटोमेशन पाइपलाइन बनाने के मुख्य बिंदु
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>GitHub Actions के माध्यम से बिल्ड और डिप्लॉयमेंट&lt;/strong>
यदि आप स्टैटिक साइट जेनरेटर का उपयोग कर रहे हैं, तो HTML जेनरेशन और होस्टिंग गंतव्य (Vercel, Netlify, Cloudflare Pages, आदि) पर डिप्लॉयमेंट को स्वचालित करने के लिए GitHub Actions का उपयोग करें। इस समय, जैसा कि ऊपर बताया गया है, Core Web Vitals के उपाय के रूप में इमेज ऑप्टिमाइज़ेशन प्रोसेस (जैसे स्वचालित रूप से WebP में बदलना) को बिल्ड पाइपलाइन में शामिल करना भी प्रभावी है।&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Zapier/IFTTT का उपयोग करके RSS-ट्रिगर SNS एकीकरण&lt;/strong>
साइट जेनरेटर बिल्ड के समय नवीनतम RSS फ़ीड (XML) उत्पन्न करेगा। इसे Zapier या Make (पूर्व में Integromat) जैसे iPaaS में फीड करें और एक ऐसा वर्कफ़्लो बनाएं जो कहता हो: &amp;ldquo;जब RSS में कोई नया आइटम जोड़ा जाता है, तो शीर्षक और URL को X (Twitter) और LinkedIn पर पोस्ट करें।&amp;rdquo; इससे लेख पब्लिश होते ही आपके फॉलोअर्स को अपने आप नोटिफिकेशन मिल जाएगा।&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Qiita/Zenn पर क्रॉस-पोस्टिंग (कैनोनिकल टैग का उपयोग)&lt;/strong>
जब आपके अपने या व्यक्तिगत ब्लॉग की डोमेन अथॉरिटी (domain power) कमजोर होती है, तो Qiita या Zenn जैसे तकनीकी प्लेटफ़ॉर्म की ऑडियंस का लाभ उठाना एक अच्छी रणनीति है। हालाँकि, केवल कॉपी और पेस्ट करने से एसईओ (SEO) पर डुप्लिकेट कंटेंट का दंड (penalty) लगने का जोखिम होता है।
इस समस्या को Qiita या Zenn लेखों के मेटाडेटा में &lt;strong>कैनोनिकल (Canonical) टैग&lt;/strong> सेट करके और अपने ब्लॉग के मूल लेख URL को निर्दिष्ट करके हल किया जा सकता है। एक स्क्रिप्ट सेट करके जो GitHub Actions से विभिन्न प्लेटफ़ॉर्म के API को कॉल करता है और स्वचालित रूप से Markdown से लेख बनाता है, आप मल्टी-चैनल वितरण को पूरी तरह से स्वचालित कर सकते हैं।&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="नषकरष-नरतर-सधर-क-चकर-क-चलए-रखन">निष्कर्ष: निरंतर सुधार के चक्र को चलाए रखना
&lt;/h2>&lt;p>तकनीकी ब्लॉग पर मासिक ट्रैफ़िक को नाटकीय रूप से बढ़ाने के लिए, &amp;ldquo;लिखने&amp;rdquo; के कार्य के अलावा, इस लेख में प्रस्तुत किए गए इंजीनियरिंग दृष्टिकोण (engineering approach) आवश्यक हैं।&lt;/p>
&lt;ol>
&lt;li>एसईओ (SEO) को ध्यान में रखकर एक मजबूत HTML और साइट आर्किटेक्चर का निर्माण&lt;/li>
&lt;li>यूज़र के सर्च इंटेंट (त्रुटि समाधान बनाम व्यवस्थित शिक्षण) को समझने वाला लेख डिज़ाइन&lt;/li>
&lt;li>Google Search Console API और पायथन (Python) का पूरा उपयोग करके डेटा विश्लेषण&lt;/li>
&lt;li>ROI को ध्यान में रखते हुए कंटेंट जीवनचक्र प्रबंधन और रीराइट&lt;/li>
&lt;li>CI/CD और Zapier एकीकरण के माध्यम से वितरण (distribution) का पूर्ण ऑटोमेशन&lt;/li>
&lt;/ol>
&lt;p>यदि आप इन सभी को एक सिस्टम के रूप में स्थापित कर सकते हैं, तो आपका तकनीकी ब्लॉग आपके करियर को मजबूती से बढ़ावा देने वाली सबसे मूल्यवान संपत्ति (asset) बन जाएगा। जो इंजीनियर ट्रैफ़िक रुकने या न बढ़ने की समस्या से जूझ रहे हैं, उन्हें आज ही से &amp;ldquo;ब्लॉग ग्रोथ हैकिंग&amp;rdquo; शुरू कर देनी चाहिए। डेवलपमेंट के काम में आपके द्वारा अर्जित प्रोग्रामिंग कौशल और आर्किटेक्चर डिज़ाइन क्षमताएँ ब्लॉग चलाने में भी आपका सबसे बड़ा हथियार बनेंगी।&lt;/p></description></item></channel></rss>