स्कोप्स पावरशेल स्क्रिप्ट को कैसे प्रभावित करते हैं

विषयसूची:

स्कोप्स पावरशेल स्क्रिप्ट को कैसे प्रभावित करते हैं
स्कोप्स पावरशेल स्क्रिप्ट को कैसे प्रभावित करते हैं

वीडियो: स्कोप्स पावरशेल स्क्रिप्ट को कैसे प्रभावित करते हैं

वीडियो: स्कोप्स पावरशेल स्क्रिप्ट को कैसे प्रभावित करते हैं
वीडियो: Intro to Figma UI Kits - Figma Tutorial with Free UI Kit - YouTube 2024, जुलूस
Anonim
बैच स्क्रिप्ट में, पर्यावरण चर में परिवर्तन डिफ़ॉल्ट रूप से वर्तमान सत्र पर वैश्विक प्रभाव डालता है। PowerShell के लिए, सटीक विपरीत सत्य है क्योंकि स्क्रिप्ट का उपयोग स्क्रिप्ट के संशोधनों को अलग करने के लिए किया जाता है। यहां, हम पता लगाएंगे कि स्कॉप्स PowerShell स्क्रिप्ट को कैसे प्रभावित करते हैं और उनके आसपास और आसपास कैसे काम करते हैं।
बैच स्क्रिप्ट में, पर्यावरण चर में परिवर्तन डिफ़ॉल्ट रूप से वर्तमान सत्र पर वैश्विक प्रभाव डालता है। PowerShell के लिए, सटीक विपरीत सत्य है क्योंकि स्क्रिप्ट का उपयोग स्क्रिप्ट के संशोधनों को अलग करने के लिए किया जाता है। यहां, हम पता लगाएंगे कि स्कॉप्स PowerShell स्क्रिप्ट को कैसे प्रभावित करते हैं और उनके आसपास और आसपास कैसे काम करते हैं।

एक गुंजाइश क्या है?

पावरशेल में, "स्कोप" वर्तमान वातावरण को संदर्भित करता है जिसमें एक स्क्रिप्ट या कमांड खोल चल रहा है। स्कोप्स का उपयोग पर्यावरण के भीतर कुछ वस्तुओं को स्क्रिप्ट या कार्यों द्वारा अनजाने में संशोधित होने से बचाने के लिए किया जाता है। विशेष रूप से, निम्न चीजों को किसी अन्य दायरे से चलने वाले आदेशों द्वारा संशोधन से संरक्षित किया जाता है, जब तक कि उन आदेशों में पैरामीटर द्वारा निर्दिष्ट नहीं किया जाता है:

  • चर
  • उपनाम
  • कार्य
  • पावरशेल ड्राइव (PSDrives)

जब भी आप कोई स्क्रिप्ट या फ़ंक्शन चलाते हैं, या जब आप कोई नया सत्र या PowerShell का उदाहरण बनाते हैं तो नए स्कोप बनाए जाते हैं। स्क्रिप्ट और फ़ंक्शंस चलाकर बनाए गए स्कोप में उस क्षेत्र के साथ "अभिभावक / बच्चा" संबंध होता है, जिससे वे बनाए गए थे। ऐसे कुछ क्षेत्र हैं जिनमें विशेष रूप से विशेष अर्थ हैं, और इन्हें नाम से एक्सेस किया जा सकता है:

  • वैश्विक स्कोप वह दायरा है जो PowerShell प्रारंभ होने पर बनाया गया है। इसमें वेरिएबल, उपनाम, फ़ंक्शंस और PSDrives शामिल हैं जो PowerShell में अंतर्निहित हैं और साथ ही आपके PowerShell प्रोफ़ाइल द्वारा किए गए किसी भी भी हैं।
  • स्थानीय गुंजाइश जो भी वर्तमान दायरा है उसे संदर्भित करता है। जब आप पावरशेल शुरू करते हैं तो यह वैश्विक स्कोप को संदर्भित करेगा, एक स्क्रिप्ट के भीतर यह स्क्रिप्ट स्कोप इत्यादि होगा।
  • लिपि स्क्रिप्ट चलाया जाता है जब स्क्रिप्ट चलाया जाता है। इस दायरे में काम करने वाले एकमात्र आदेश स्क्रिप्ट में हैं।
  • निजी स्कॉप्स को मौजूदा दायरे में परिभाषित किया जा सकता है, अन्य स्कॉप्स में कमांड को उन वस्तुओं को पढ़ने या संशोधित करने में सक्षम होने से रोकने के लिए जिन्हें वे अन्यथा एक्सेस कर सकते हैं।

स्कोप्स को कुछ कमांडों में संख्या द्वारा भी संदर्भित किया जा सकता है, जहां वर्तमान दायरे को शून्य के रूप में जाना जाता है और इसके पूर्वजों को पूर्णांक बढ़कर संदर्भित किया जाता है। उदाहरण के लिए, वैश्विक दायरे से चलने वाली एक स्क्रिप्ट के भीतर, स्क्रिप्ट स्कोप 0 होगा और वैश्विक दायरा 1 होगा। एक स्कोप जिसे स्क्रिप्ट स्कोप, जैसे फ़ंक्शन के भीतर घोंसला दिया गया था, वैश्विक दायरे को 2 के रूप में संदर्भित करेगा नकारात्मक संख्या हालांकि बच्चे के दायरे को संदर्भित करने के लिए काम नहीं करेगी - इसके कारण जल्द ही स्पष्ट होगा।

कैसे स्कॉप्स कमांड प्रभावित करते हैं

जैसा कि पहले उल्लेख किया गया है, एक दायरे में निष्पादित आदेश किसी अन्य दायरे में चीजों को प्रभावित नहीं करेंगे जब तक कि विशेष रूप से ऐसा करने के लिए कहा न जाए। उदाहरण के लिए, यदि $ MyVar वैश्विक दायरे में मौजूद है और एक स्क्रिप्ट $ MyVar को एक अलग मूल्य पर सेट करने के लिए एक कमांड चलाती है, तो $ MyVar का वैश्विक संस्करण अनारक्षित रहेगा जबकि $ MyVar की एक प्रति स्क्रिप्ट स्कोप में नई के साथ रखी जाएगी मूल्य। यदि एक $ MyVar मौजूद नहीं है, तो एक स्क्रिप्ट डिफ़ॉल्ट रूप से स्क्रिप्ट स्कोप के भीतर इसे बनाएगी - वैश्विक दायरे में नहीं। याद रखना महत्वपूर्ण है क्योंकि आप स्कॉप्स के बीच वास्तविक माता-पिता / बाल संबंधों के बारे में जानेंगे।

PowerShell में स्कॉप्स के माता-पिता / बाल संबंध एक तरफा है। कमांड, वर्तमान दायरे, इसके माता-पिता और उसके ऊपर के किसी भी क्षेत्र में वैकल्पिक रूप से संशोधित, और वैकल्पिक रूप से संशोधित कर सकते हैं। हालांकि, वे मौजूदा दायरे के किसी भी बच्चे में चीजों को देख या संशोधित नहीं कर सकते हैं। यह मुख्य रूप से इसलिए है, एक बार जब आप माता-पिता के दायरे में चले जाते हैं, तो बच्चे का दायरा पहले ही नष्ट हो चुका है क्योंकि उसने अपना उद्देश्य पूरा कर लिया है। उदाहरण के लिए, स्क्रिप्ट समाप्त होने के बाद, वैश्विक दायरे से, आपको स्क्रिप्ट स्कोप में एक चर को क्यों देखना या संशोधित करना होगा? ऐसे कई मामले हैं जहां आपको स्क्रिप्ट या फ़ंक्शन के परिवर्तनों को पूरा होने से परे बने रहने की आवश्यकता होती है, लेकिन ऐसा नहीं है कि आपको स्क्रिप्ट या फ़ंक्शन के दायरे में ऑब्जेक्ट्स में बदलाव करने से पहले या बाद में चलाने की आवश्यकता होगी। (आमतौर पर, ऐसी चीजों को स्क्रिप्ट के हिस्से के रूप में संभाला जाएगा या फिर भी कार्य करेगा।)

बेशक, अपवादों के बिना नियम क्या हैं? उपर्युक्त के लिए एक अपवाद निजी स्कॉप्स हैं। निजी क्षेत्रों में ऑब्जेक्ट केवल उन दायरे में चलने वाले आदेशों तक पहुंच योग्य होते हैं, जिनसे वे बनाए गए थे। एक और महत्वपूर्ण अपवाद वह वस्तु है जिसमें ऑलस्कोप संपत्ति है। ये विशेष चर और उपनाम हैं जिसके लिए किसी भी क्षेत्र में परिवर्तन सभी क्षेत्रों को प्रभावित करेगा। निम्नलिखित आदेश आपको दिखाएंगे कि कौन से चर और उपनामों में ऑलस्कोप संपत्ति है:

Get-Variable | Where-Object {$_.Options -match 'AllScope'} Get-Alias | Where-Object {$_.Options -match 'AllScope')

कार्रवाई में स्कोप्स

कार्रवाई में स्कॉप्स पर हमारी पहली नजर के लिए, हम एक पावरशेल सत्र में शुरू करने जा रहे हैं जहां परिवर्तनीय $ MyVar को स्ट्रिंग पर सेट किया गया है, 'मैं वैश्विक चर हूं!', कमांड लाइन से। फिर, निम्न स्क्रिप्ट स्कोप-डेमो.पीएस 1 नामक फ़ाइल से चलाई जाएगी:

Function FunctionScope { 'Changing $MyVar with a function.' $MyVar = 'I got set by a function!' 'MyVar says $MyVar' } '' 'Checking current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' '' FunctionScope '' 'Checking final value of MyVar before script exit.' 'MyVar says $MyVar' ''

यदि पावरशेल स्क्रिप्ट्स बैच स्क्रिप्ट के समान काम करती हैं, तो हम 'आई ग्लोबल वैरिएबल!' से बदलने के लिए $ MyVar (या बैच सिंटैक्स में% MyVar%) की बदौलत उम्मीद करेंगे, 'मुझे एक स्क्रिप्ट द्वारा सेट किया गया है!', और आखिर में 'मुझे एक समारोह द्वारा सेट किया गया!' जहां यह तब तक रहेगा जब तक कि यह स्पष्ट रूप से बदल नहीं जाता है या सत्र समाप्त हो जाता है। हालांकि, देखें कि वास्तव में यहां क्या होता है क्योंकि हम प्रत्येक स्कोप से आगे बढ़ते हैं - विशेष रूप से, फ़ंक्शनस्कोप फ़ंक्शन ने अपना काम पूरा कर लिया है और हम फिर से स्क्रिप्ट से वैरिएबल की जांच करते हैं, और बाद में ग्लोबल, स्कोप।

जैसा कि आप देख सकते हैं कि वैरिएबल बदलना प्रतीत होता है क्योंकि हम स्क्रिप्ट के माध्यम से चले गए थे, क्योंकि जब तक फंक्शनस्कोप फ़ंक्शन पूरा नहीं हुआ, हम वैरिएबल पर उसी स्कोप के भीतर से जांच कर रहे थे, जिसे अंतिम बार बदल दिया गया था। फ़ंक्शनस्कोप के बाद भी, हम स्क्रिप्ट स्कोप में वापस चले गए जहां $ MyVar को फ़ंक्शन द्वारा छूटा गया था। फिर, जब स्क्रिप्ट समाप्त हो गई, तो हम वैश्विक दायरे में वापस आ गए जहां इसे बिल्कुल संशोधित नहीं किया गया था।
जैसा कि आप देख सकते हैं कि वैरिएबल बदलना प्रतीत होता है क्योंकि हम स्क्रिप्ट के माध्यम से चले गए थे, क्योंकि जब तक फंक्शनस्कोप फ़ंक्शन पूरा नहीं हुआ, हम वैरिएबल पर उसी स्कोप के भीतर से जांच कर रहे थे, जिसे अंतिम बार बदल दिया गया था। फ़ंक्शनस्कोप के बाद भी, हम स्क्रिप्ट स्कोप में वापस चले गए जहां $ MyVar को फ़ंक्शन द्वारा छूटा गया था। फिर, जब स्क्रिप्ट समाप्त हो गई, तो हम वैश्विक दायरे में वापस आ गए जहां इसे बिल्कुल संशोधित नहीं किया गया था।

स्थानीय दायरे के बाहर पहुंच रहा है

तो, यह आपकी अच्छी और अच्छी तरह से अच्छी है कि आप अपनी स्क्रिप्ट और कार्यों से परे पर्यावरण में परिवर्तनों को गलती से लागू करने में मदद करें, लेकिन यदि आप वास्तव में ऐसे संशोधन करना चाहते हैं तो क्या होगा? स्थानीय क्षेत्र से परे वस्तुओं को बनाने और संशोधित करने के लिए एक विशेष, और काफी सरल, वाक्यविन्यास है। आप वैरिएबल नाम की शुरुआत में स्कोप नाम डालते हैं, और दायरे और चर नामों के बीच एक कोलन डालते हैं। ऐशे ही:

$global:MyVar $script:MyVar $local:MyVar

वे चर को देखने और सेट करते समय इन संशोधकों का उपयोग कर सकते हैं। चलो देखते हैं कि इस प्रदर्शन स्क्रिप्ट के साथ क्या होता है:

Function FunctionScope { '' 'Changing $MyVar in the local function scope…' $local:MyVar = 'This is MyVar in the function's local scope.' 'Changing $MyVar in the script scope…' $script:MyVar = 'MyVar used to be set by a script. Now set by a function.' 'Changing $MyVar in the global scope…' $global:MyVar = 'MyVar was set in the global scope. Now set by a function.' '' 'Checking $MyVar in each scope…' 'Local: $local:MyVar' 'Script: $script:MyVar' 'Global: $global:MyVar' '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''

पहले की तरह, हम वैरिएबल को ग्लोबल स्कोप में सेट करके शुरू करेंगे और अंतिम वैश्विक स्कोप परिणाम की जांच के साथ समाप्त करेंगे।

यहां आप देख सकते हैं कि फ़ंक्शनस्कोप स्क्रिप्ट स्कोप में चर बदलने में सक्षम था, और इसे पूरा होने के बाद परिवर्तन जारी रहेगा। साथ ही, स्क्रिप्ट के बाहर निकलने के बाद भी वैश्विक दायरे में चर में परिवर्तन जारी रहा। यह विशेष रूप से उपयोगी हो सकता है यदि आपको एक ही कोड का उपयोग करके स्क्रिप्ट के भीतर चर या वैश्विक स्तर के भीतर चर बदलना है,
यहां आप देख सकते हैं कि फ़ंक्शनस्कोप स्क्रिप्ट स्कोप में चर बदलने में सक्षम था, और इसे पूरा होने के बाद परिवर्तन जारी रहेगा। साथ ही, स्क्रिप्ट के बाहर निकलने के बाद भी वैश्विक दायरे में चर में परिवर्तन जारी रहा। यह विशेष रूप से उपयोगी हो सकता है यदि आपको एक ही कोड का उपयोग करके स्क्रिप्ट के भीतर चर या वैश्विक स्तर के भीतर चर बदलना है,

जैसा कि पहले उल्लेख किया गया है, स्थानीय स्कोप के संबंध में विभिन्न स्तरों पर चर को संशोधित करने के लिए कुछ आदेशों में स्कोप संख्याओं का भी उपयोग किया जा सकता है। यहां ऊपर दिए गए दूसरे उदाहरण में उपयोग की जाने वाली एक ही स्क्रिप्ट है, लेकिन फंक्शन के साथ नाम-स्कोप के साथ चर के संदर्भ में सीधे संदर्भ के बजाय स्कोप संख्याओं के साथ गेट-वेरिएबल और सेट-वेरिएबल कमांड का उपयोग करने के लिए संशोधित किया गया है:

Function FunctionScope { '' 'Changing $MyVar in scope 0, relative to FunctionScope…' Set-Variable MyVar 'This is MyVar in the function's scope 0.' –Scope 0 'Changing $MyVar in scope 1, relative to FunctionScope…' Set-Variable MyVar 'MyVar was changed in scope 1, from a function.' –Scope 1 'Changing $MyVar in scope 2, relative to Functionscope…' Set-Variable MyVar 'MyVar was changed in scope 2, from a function.' –Scope 2 '' 'Checking $MyVar in each scope…' ‘Scope 0:’ Get-Variable MyVar –Scope 0 –ValueOnly ‘Scope 1:’ Get-Variable MyVar –Scope 1 –ValueOnly ‘Scope 2:’ Get-Variable MyVar –Scope 2 –ValueOnly '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''

Image
Image

पहले की तरह, हम यहां देख सकते हैं कि एक दायरे में कमांड कैसे अपने मूल दायरे में वस्तुओं को संशोधित कर सकते हैं।

अतिरिक्त जानकारी

इस लेख में फिट होने की तुलना में स्कॉप्स के साथ अभी भी बहुत कुछ किया जा सकता है। स्कोप्स केवल चर से अधिक प्रभावित करते हैं, और अभी भी निजी क्षेत्रों और ऑलस्कोप चर के बारे में और जानने के लिए और भी कुछ है। अधिक उपयोगी जानकारी के लिए, आप PowerShell के भीतर से निम्न आदेश चला सकते हैं:

Get-Help about_scopes

TechNet पर एक ही सहायता फ़ाइल भी उपलब्ध है।

स्कोप छवि क्रेडिट: openclipart पर spadassin

सिफारिश की: