PowerShell ISE स्क्रिप्ट चर को स्क्रिप्ट क्षेत्र में अलग क्यों नहीं करता है?


12

PowerShell में, स्कोपिंग को वैश्विक वातावरण को प्रभावित करने वाली लिपियों में ऑब्जेक्ट्स (चर, उपनाम, कार्य आदि) रखने के लिए माना जाता है। यह कमांड लाइन पर ठीक काम करता प्रतीत होता है, लेकिन आईएसई में नहीं।

यहाँ कंसोल में एक प्रदर्शन है। मैं यह देखने के लिए जाँच करता हूं कि $xवैश्विक दायरे में परिभाषित नहीं किया गया है, की सामग्री दिखाएं ScopeTest.ps1और फिर उसे चलाएं, और अंत में मैं यह देखने के लिए जांचता हूं कि $xक्या फिर से परिभाषित किया गया है। जैसा कि अपेक्षित था, $xकेवल स्क्रिप्ट के दायरे में बनाया और उपयोग किया जाता है और स्क्रिप्ट के समाप्त होने के बाद वैश्विक वातावरण में नहीं रहता है।

यहाँ छवि विवरण दर्ज करें

ISE में, यह काम करता है अगर स्क्रिप्ट को कंसोल विंडो का उपयोग करके कहा जाता है।

यहाँ छवि विवरण दर्ज करें

हालाँकि, अगर मैं वास्तव में "रन स्क्रिप्ट" बटन, या F5 का उपयोग करता हूं, तो स्क्रिप्ट के भीतर चर इसे पूरा होने के बाद भी जारी रहेगा।

यहाँ छवि विवरण दर्ज करें

यह स्क्रिप्ट को लिखना और समस्या निवारण करना थोड़ा मुश्किल बना सकता है, अगर स्क्रिप्ट मान ले कि यह एक स्वच्छ वातावरण से शुरू होगा (यानी: स्क्रिप्ट के भीतर निर्धारित कोई भी चर पहले से मौजूद नहीं होना चाहिए।)। ISE इस तरह से व्यवहार क्यों करता है?

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

जवाबों:


9

आपके स्क्रिप्ट उदाहरणों में आपने चर बनाए और आपने उन्हें अपनी स्क्रिप्ट के अंत में नष्ट नहीं किया। ISE ने पॉवरशेल का एक जीवंत उदाहरण बनाया है जो क्लिक करने पर स्क्रिप्ट को लोड और चलाता है। अंतर यह है कि एकीकृत शेल स्क्रिप्ट को जारी रख सकता है। यह पर्यावरण को डीबग करने और स्क्रिप्ट बनाने के लिए आदर्श है जैसा कि आप जाते हैं। इस तरह से आपको अपनी स्क्रिप्ट को बार-बार चालू रखने की ज़रूरत नहीं है (ऐसी परिस्थितियाँ हैं जहाँ यह आदर्श नहीं होगा) यह सुनिश्चित करने के लिए कि कोड की अगली पंक्ति काम की है। आप इसे शेल में टाइप करते हैं, और यदि यह काम करता है, तो आप इसे स्क्रिप्ट अनुभाग में जोड़ते हैं।

यह व्यवहार शायद यहाँ सबसे अच्छा वर्णित है: http://technet.microsoft.com/en-us/library/dd819480.aspx

प्रासंगिक अंश:

ISE में सभी पैन हमेशा एक ही दायरे में होते हैं।

यदि आप नहीं चाहते हैं कि आपकी स्क्रिप्ट पूरी होने के बाद आपके चर शेल में रहें, तो आपको Remove-Variableउन्हें करना चाहिए ।

उदाहरण के लिए:

Remove-Variable x

आप फ़ाइल-> न्यू पॉवर्सशेल टैब पर क्लिक करके ISE को पॉवरशेल का "क्लीन" उदाहरण जोड़ सकते हैं


2

ISE में पॉवर्सहेल अनिवार्य रूप से स्क्रिप्ट को शेल में डंप कर रहा है और फिर इसे चला रहा है। जैसे कि आपने इसे शेल में टाइप किया है, तो इसे निष्पादित किया है। तो चर उस सत्र के लिए उपलब्ध है। अन्य अंतर देखने के लिए, इस MSDN पोस्ट को देखें।


मुझे इस व्यवहार को संबोधित करने वाले लिंक में कुछ भी दिखाई नहीं दे रहा है।
इज़ी जूल

0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.