कैसे स्कोप पॉवरशेल लिपियों को प्रभावित करते हैं
बैच स्क्रिप्ट में, पर्यावरण चर में परिवर्तन का डिफ़ॉल्ट रूप से वर्तमान सत्र के लिए वैश्विक प्रभाव पड़ता है। PowerShell के लिए, सटीक विपरीत सत्य है क्योंकि स्क्रिप्ट के संशोधनों को अलग करने के लिए स्कोप का उपयोग किया जाता है। यहां, हम यह पता लगाएंगे कि स्कोप्स पॉवरशेल स्क्रिप्ट को कैसे प्रभावित करते हैं और उनमें और उनके आसपास कैसे काम करते हैं.
एक स्कोप क्या है?
PowerShell में, एक "स्कोप" वर्तमान परिवेश को संदर्भित करता है जिसमें एक स्क्रिप्ट या कमांड शेल चल रहा है। स्कोप का उपयोग पर्यावरण के भीतर कुछ वस्तुओं को लिपियों या कार्यों द्वारा अनजाने में संशोधित करने से बचाने के लिए किया जाता है। विशेष रूप से, जब तक उन आदेशों में पैरामीटर द्वारा अन्यथा निर्दिष्ट नहीं किया जाता है, तब तक निम्नलिखित चीजों को अन्य दायरे से चलने वाली कमांड द्वारा संशोधन से सुरक्षित किया जाता है:
- चर
- उपनाम
- कार्य
- PowerShell ड्राइव (PSDrives)
जब भी आप कोई स्क्रिप्ट या फ़ंक्शन चलाते हैं, या जब आप PowerShell का नया सत्र या उदाहरण बनाते हैं, तो नए स्कोप बनाए जाते हैं। स्क्रिप्ट और फ़ंक्शंस चलाकर बनाए गए स्कोप का उस दायरे से "माता-पिता / बच्चे" का संबंध होता है, जिससे वे बनाए गए थे। कुछ स्कोप हैं जिनमें विशेष रूप से विशेष अर्थ हैं, और नाम से पहुँचा जा सकता है:
- वैश्विक स्कोप वह स्कोप है जो पॉवरशेल शुरू होने पर बनाया जाता है। इसमें वैरिएबल, अलायस, फ़ंक्शंस, और PSDrives शामिल हैं जो कि PowerShell के साथ-साथ आपके PowerShell प्रोफ़ाइल द्वारा बनाए गए हैं।.
- स्थानीय स्कोप से तात्पर्य जो कुछ भी है वह वर्तमान दायरा है जब आप पावरशेल शुरू करते हैं तो यह ग्लोबल स्कोप को संदर्भित करेगा, एक स्क्रिप्ट के भीतर यह स्क्रिप्ट स्कोप होगा, आदि.
- लिपि स्क्रिप्ट चलने पर स्कोप बनता है। इस दायरे में काम करने वाले एकमात्र कमांड स्क्रिप्ट में हैं.
- निजी स्कोप्स को वर्तमान स्कोप के भीतर परिभाषित किया जा सकता है, अन्य स्कोप में कमांड्स को पढ़ने या उन वस्तुओं को संशोधित करने से रोकने के लिए जिन्हें वे अन्यथा एक्सेस कर सकते हैं।.
कुछ आदेशों में स्कोप्स को संख्या से भी संदर्भित किया जा सकता है, जहां वर्तमान क्षेत्र को शून्य के रूप में संदर्भित किया जाता है और इसके पूर्वजों को पूर्णांक बढ़ाकर संदर्भित किया जाता है। उदाहरण के लिए, ग्लोबल स्कोप से चलने वाली स्क्रिप्ट के भीतर, स्क्रिप्ट स्कोप 0 होगा और ग्लोबल स्कोप होगा। 1. एक स्कोप जो स्क्रिप्ट स्कोप के भीतर नेस्टेड था, जैसे कि एक फंक्शन, ग्लोबल स्कोप 2 के रूप में संदर्भित करेगा। । हालांकि, बच्चे के स्कोपों को संदर्भित करने के लिए नकारात्मक संख्याएं काम नहीं करेंगी - इसका कारण शीघ्र ही स्पष्ट हो जाएगा.
स्कोप्स कमांड को कैसे प्रभावित करते हैं
जैसा कि पहले उल्लेख किया गया है, जब तक कि विशेष रूप से ऐसा करने के लिए नहीं कहा जाता है, तब तक एक दायरे में निष्पादित आदेश किसी अन्य दायरे में चीजों को प्रभावित नहीं करेगा। उदाहरण के लिए, यदि $ MyVar ग्लोबल स्कोप में मौजूद है और एक स्क्रिप्ट $ MyVar को एक अलग मूल्य पर सेट करने के लिए एक कमांड चलाता है, तो $ MyVar का ग्लोबल वर्जन अनसाल्टेड रहेगा जबकि $ MyVar की एक कॉपी स्क्रिप्ट स्कोप में नए के साथ रखी गई है मूल्य। यदि कोई $ MyVar मौजूद नहीं है, तो एक स्क्रिप्ट इसे डिफ़ॉल्ट रूप से स्क्रिप्ट स्कोप के भीतर बनाएगी - ग्लोबल स्कोप में नहीं। यह याद रखना महत्वपूर्ण है क्योंकि आप वास्तविक माता-पिता / बच्चों के बीच संबंधों के बारे में सीखते हैं.
PowerShell में माता-पिता / बच्चों के संबंध एक तरह से हैं। कमांड को देख सकते हैं, और वैकल्पिक रूप से संशोधित कर सकते हैं, वर्तमान गुंजाइश, उसके माता-पिता और उसके ऊपर कोई भी स्कोप। हालांकि, वे मौजूदा दायरे के किसी भी बच्चे में चीजों को देख या संशोधित नहीं कर सकते हैं। यह मुख्य रूप से है, क्योंकि एक बार जब आप मूल दायरे में चले जाते हैं, तो बच्चे का दायरा पहले ही नष्ट हो चुका होता है क्योंकि इसने अपना उद्देश्य पूरा कर लिया है। उदाहरण के लिए, स्क्रिप्ट समाप्त होने के बाद, आपको स्क्रिप्ट स्कोप को ग्लोबल स्कोप से वैरिएबल में क्यों देखना या संशोधित करना होगा? ऐसे बहुत से मामले हैं जहाँ आपको इसके पूरा होने से पहले बने रहने के लिए किसी स्क्रिप्ट या फ़ंक्शन के परिवर्तनों की आवश्यकता होती है, लेकिन ऐसा नहीं है जहाँ आपको स्क्रिप्ट के कार्य या कार्यक्षेत्र में ऑब्जेक्ट्स को चलाने से पहले या उसके बाद परिवर्तन करने की आवश्यकता होगी। (आमतौर पर, इस तरह की चीजों को स्क्रिप्ट के हिस्से के रूप में संभाला जाएगा या वैसे भी खुद ही काम किया जाएगा।)
बेशक, अपवाद के बिना नियम क्या हैं? ऊपर दिए गए एक अपवाद निजी स्कोप हैं। निजी स्कोप में वस्तुएं केवल उस दायरे में चलने के लिए पहुंच योग्य हैं, जहां से वे बनाए गए थे। एक अन्य महत्वपूर्ण अपवाद आइटम है जिसमें ऑलस्कोप संपत्ति है। ये विशेष चर और उपनाम हैं, जिनके लिए किसी भी दायरे में बदलाव सभी स्कोप को प्रभावित करेगा। निम्नलिखित आदेश आपको दिखाएंगे कि कौन से चर और उपनाम के पास ऑलस्कोप संपत्ति है:
गेट-वेरिएबल | जहाँ-जहाँ $ _। विकल्प -match 'AllScope' Get-Alias | कहाँ-वस्तु $ _। विकल्प -मंच 'AllScope')
कार्रवाई में स्कोप
कमांड में स्कोप्स पर हमारी पहली नज़र के लिए, हम एक पॉवरशेल सत्र में शुरू करने जा रहे हैं, जहाँ कमांड लाइन से वेरिएबल $ MyVar को एक स्ट्रिंग पर सेट किया गया है, 'मैं एक ग्लोबल वेरिएबल हूँ!'। फिर, स्कोप-डेमो.प्स 1 नामक फाइल से निम्नलिखित स्क्रिप्ट को चलाया जाएगा:
फ़ंक्शन फ़ंक्शनस्कोप 'फ़ंक्शन के साथ $ MyVar बदलना।' $ MyVar = 'मुझे एक फ़ंक्शन द्वारा सेट किया गया है!' "MyVar $ MyVar कहता है" "$ MyVar का वर्तमान मूल्य जाँच रहा है।" "MyVar $ MyVar कहती है" "स्क्रिप्ट द्वारा $ MyVar बदलना।" $ MyVar = 'मैं एक स्क्रिप्ट द्वारा सेट हो गया!' "MyVar $ MyVar कहती है" "फंक्शनस्कोप" स्क्रिप्ट बाहर निकलने से पहले MyVar का अंतिम मूल्य जाँच रहा है। ' "MyVar कहते हैं $ MyVar"
यदि PowerShell स्क्रिप्ट ने बैच स्क्रिप्ट के समान काम किया, तो हम 'मैं एक स्क्रिप्ट द्वारा सेट किया गया था' से "MyVar% (बैच सिंटैक्स में% MyVar%) बैच में बदलने की उम्मीद करूंगा।" , और अंत में 'मैं एक समारोह से सेट हो गया!' जब तक यह स्पष्ट रूप से फिर से बदल दिया जाता है या सत्र समाप्त हो जाता है तब तक यह बना रहेगा। हालाँकि, देखें कि वास्तव में यहाँ क्या होता है क्योंकि हम प्रत्येक स्कोप के माध्यम से आगे बढ़ते हैं - विशेष रूप से, जब फंक्शनस्कोप फ़ंक्शन ने अपना काम पूरा कर लिया है और हम स्क्रिप्ट से फिर से चर की जांच करते हैं, और बाद में ग्लोबल, स्कोप.
जैसा कि आप देख सकते हैं कि चर हमें स्क्रिप्ट के माध्यम से स्थानांतरित होने के रूप में दिखाई देता है, क्योंकि जब तक फंक्शनस्कोप फ़ंक्शन पूरा नहीं हो जाता है, तब तक हम चर पर जाँच रहे थे उसी दायरे के भीतर से इसे अंतिम रूप से बदल दिया गया था। फंक्शनस्कोप के किए जाने के बाद, हम स्क्रिप्ट स्कोप में वापस चले गए जहां $ MyVar को फ़ंक्शन से अछूता छोड़ दिया गया था। फिर, जब स्क्रिप्ट समाप्त हो गई, तो हम ग्लोबल स्कोप में वापस आ गए, जहाँ इसे बिल्कुल भी संशोधित नहीं किया गया था.
स्थानीय स्कोप के बाहर तक पहुँचना
तो, यह आपकी स्क्रिप्ट और फ़ंक्शंस से परे गलती से पर्यावरण में बदलाव को लागू करने में आपकी मदद करने के लिए सब ठीक है और अच्छा है, लेकिन अगर आप वास्तव में इस तरह के संशोधन करना चाहते हैं तो क्या होगा? स्थानीय दायरे से परे वस्तुओं को बनाने और संशोधित करने के लिए एक विशेष और काफी सरल, वाक्यविन्यास है। आप बस चर नाम की शुरुआत में स्कोप नाम रखते हैं, और स्कोप और चर नामों के बीच एक कोलन लगाते हैं। ऐशे ही:
$ वैश्विक: MyVar $ स्क्रिप्ट: MyVar $ स्थानीय: MyVar
चरों को देखने और सेट करने के दौरान आप इन संशोधक का उपयोग कर सकते हैं। आइए देखें कि इस प्रदर्शन स्क्रिप्ट के साथ क्या होता है:
फ़ंक्शन फ़ंक्शनस्कोप "स्थानीय फ़ंक्शन दायरे में $ MyVar को बदलना ... '$ स्थानीय: MyVar =" यह फ़ंक्शन के स्थानीय दायरे में MyVar है। "' स्क्रिप्ट के दायरे में $ MyVar को बदलना ... '$ स्क्रिप्ट: MyVar =' MyVar हुआ करता था। एक स्क्रिप्ट द्वारा सेट किया गया। अब एक फ़ंक्शन द्वारा सेट किया गया है। "वैश्विक दायरे में $ MyVar को बदलना ... '$ वैश्विक: MyVar =' MyVar को वैश्विक दायरे में सेट किया गया था। अब एक फ़ंक्शन द्वारा सेट करें। "प्रत्येक दायरे में $ MyVar की जाँच कर रहा है ... '" स्थानीय: $ स्थानीय: MyVar "" स्क्रिप्ट: $ स्क्रिप्ट: MyVar "" वैश्विक: $ वैश्विक: MyVar "" "$ VVar का वर्तमान मूल्य प्राप्त करना।' "MyVar $ MyVar कहती है" "स्क्रिप्ट द्वारा $ MyVar बदलना।" $ MyVar = 'मैं एक स्क्रिप्ट द्वारा सेट हो गया!' "MyVar $ MyVar कहता है" FunctionScope 'बाहर निकलने से पहले स्क्रिप्ट गुंजाइश से $ MyVar की जाँच कर रहा है।' "MyVar कहते हैं $ MyVar"
पहले की तरह, हम ग्लोबल स्कोप में वैरिएबल सेट करके शुरू करेंगे और अंतिम ग्लोबल स्कोप रिजल्ट चेक करने के साथ समाप्त होंगे.
यहाँ आप देख सकते हैं कि FunctionScope स्क्रिप्ट स्कोप में परिवर्तनशील परिवर्तन करने में सक्षम था, और परिवर्तन पूर्ण होने के बाद भी बना रहता है। इसके अलावा, ग्लोबल स्कोप में वैरिएबल में परिवर्तन स्क्रिप्ट से बाहर होने के बाद भी बना रहा। यह विशेष रूप से तब उपयोगी हो सकता है जब आपको किसी स्क्रिप्ट के भीतर या वैश्विक दायरे में बार-बार चर को बदलना हो, उसी कोड का उपयोग करके - आप केवल एक फ़ंक्शन या स्क्रिप्ट को परिभाषित करते हैं जो कि चर को संशोधित करने के लिए लिखा जाता है कि आपको कहां और कैसे इसकी आवश्यकता है, और उस पर कॉल करें जब भी वे परिवर्तन आवश्यक हों.
जैसा कि पहले उल्लेख किया गया है, स्कोप नंबरों का उपयोग स्थानीय स्कोप के संबंध में विभिन्न स्तरों पर चर को संशोधित करने के लिए कुछ आदेशों में भी किया जा सकता है। यहां ऊपर दिए गए दूसरे उदाहरण में एक ही स्क्रिप्ट का उपयोग किया गया है, लेकिन फ़ंक्शन के साथ गेट-वेरिएबल और सेट-वेरिएबल कमांड का उपयोग करने के लिए संशोधित स्कोप के साथ वेरिएबल को सीधे संदर्भित करने के बजाय स्कोप संख्याओं के साथ:
फंक्शनस्स्कोप "फंक्शनस्स्कोप के सापेक्ष 0 MyVar को स्कोप 0 में बदलना ... 'सेट-वैरिएबल MyVar" यह फंक्शन के स्कोप में MyVar है। "-Sopeope 0' फंक्शनScope के सापेक्ष 1 'स्कोप में $ MyVar को बदलते हुए,' सेट-वेरिएबल 'के सापेक्ष। एक समारोह से MyVar 'MyVar को दायरे 1 में बदल दिया गया।' -Scope 1 'कार्य 2 में $ MyVar बदल रहा है, Functionscope के सापेक्ष ...' Set-Variable MyVar 'MyVar को एक फ़ंक्शन से स्कोप 2 में बदल दिया गया।' -Scope 2 "प्रत्येक दायरे में $ MyVar की जाँच कर रहा है ..." Scope 0: 'Get-Variable MyVar -Scope 0 -ValueOnly' स्कोप 1: 'Get-Variable MyVar -Scope 1 -ValueOnly' स्कोप 2: 'Get-Variable MyVar -Sope 2 -ValueOnly "" $ MyVar का वर्तमान मूल्य प्राप्त करना। ' "MyVar $ MyVar कहती है" "स्क्रिप्ट द्वारा $ MyVar बदलना।" $ MyVar = 'मैं एक स्क्रिप्ट द्वारा सेट हो गया!' "MyVar $ MyVar कहता है" FunctionScope 'बाहर निकलने से पहले स्क्रिप्ट गुंजाइश से $ MyVar की जाँच कर रहा है।' "MyVar कहते हैं $ MyVar"
पहले की तरह, हम यहां देख सकते हैं कि कैसे एक दायरे में कमांड्स अपने मूल दायरे में वस्तुओं को संशोधित कर सकती हैं.
अतिरिक्त जानकारी
इस लेख में फिट किए जा सकने वाले स्कोप के साथ अभी भी बहुत कुछ किया जा सकता है। स्कोप्स सिर्फ वेरिएबल्स से अधिक प्रभावित करते हैं, और प्राइवेट स्कैप्स और ऑलस्कोप वैरिएबल्स के बारे में अभी भी बहुत कुछ सीखा जा सकता है। अधिक उपयोगी जानकारी के लिए, आप PowerShell के भीतर से निम्न कमांड चला सकते हैं:
गेट-हेल्प about_scopes
वही मदद फ़ाइल TechNet पर भी उपलब्ध है.
स्कोप इमेज क्रेडिट: स्पैन्डेसेन ऑन ओपेनक्लिपार्ट