2013-02-14 21 views
22

अगर मैं अपनी मुख्य कार्यक्षमता को अपनी मुख्य पावरशेल स्क्रिप्ट से अलग करना चाहता हूं, तो मैं या तो इसे .ps1 फ़ाइल और डॉट स्रोत के रूप में लिख सकता हूं या मैं इसे .psm1 के रूप में बना सकता हूं और आयात कर सकता हूं Import-Module का उपयोग कर वही।पावरशेल आयात-मॉड्यूल बनाम डॉट सोर्सिंग

कौन सा बेहतर है और क्यों?

+0

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

+2

यदि आप सोचते हैं कि आपके पास एक मिला है, यहां तक ​​कि संयुक्त भी है तो यह अभी भी बेहतर है। (बीटीडब्ल्यू, मेरा नहीं, यह सिर्फ टिप्पणी जोड़ता है)। –

उत्तर

13

डॉट्ससोर्सिंग + स्क्रिप्ट और मॉड्यूल 2 अलग-अलग चीजें हैं। मॉड्यूल फ़ंक्शंस और cmdlets एकत्र करने के लिए बहुत अच्छे हैं जिन्हें आप एक स्क्रिप्ट में उपयोग करेंगे। यदि आपके पास ऐसे फ़ंक्शन हैं जिन्हें आप इंटरैक्टिव रूप से उपयोग करना चाहते हैं (आप कंसोल में फ़ंक्शन को कॉल करते हैं), तो मॉड्यूल एक अच्छा फिट हो सकता है।

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

यह आपके लिए आवश्यक चीज़ों पर निर्भर करता है। सारांश:

  • यदि आप इस स्थिति (स्क्रिप्ट/नौकरी) में फ़ंक्शन/स्क्रिप्ट का उपयोग करते हैं = डॉट स्रोत का उपयोग करें।
  • यदि आप अन्य स्क्रिप्ट्स में भी उपयोग किए जाने वाले सामान्य फ़ंक्शंस/स्क्रिप्ट का उपयोग करते हैं या आप इंटरैक्टिव रूप से कुछ कार्यों को कॉल करना चाहते हैं आदि = मॉड्यूल का उपयोग करें।
24

मॉड्यूल पुस्तकालयों के लिए सबसे अच्छे हैं। मॉड्यूल से निर्यात किए जाने वाले चीज़ों पर वे आपको अधिक नियंत्रण देते हैं। डिफ़ॉल्ट रूप से यह एक पीएसएम 1 फ़ाइल में सभी स्क्रिप्ट चर निजी होते हैं - आयात किए जाने पर मॉड्यूल के बाहर दिखाई नहीं देते हैं। इसी प्रकार, सभी कार्य सार्वजनिक हैं। हालांकि, आप अपने मॉड्यूल से निर्यात करने वाले सटीक, फ़ंक्शंस, उपनाम, cmdlets, आदि को नियंत्रित करने के लिए अपनी पीएसएम 1 फ़ाइल में निर्यात-मॉड्यूलमेम्बर का उपयोग कर सकते हैं। मॉड्यूल को आपके सत्र से भी हटाया जा सकता है जो एक .PS1 स्क्रिप्ट dotsourcing के साथ एक बड़ा अंतर है। एक और अंतर यह है कि मॉड्यूल फ़ंक्शंस को उस मॉड्यूल द्वारा नामित किया जाता है, जिससे आप मॉड्यूल नाम को उपसर्ग करके और \ "\" फ़ंक्शन नाम में आसानी से समान रूप से नामित मॉड्यूल-आधारित फ़ंक्शंस तक पहुंच सकते हैं। PSCX \ प्राप्त करें-अपटाइम। आईएसई में, यह उपसर्ग इंटेलिजेंस समर्थन भी आमंत्रित करता है।

मैं आम तौर पर मॉड्यूल के साथ जाने की अनुशंसा करता हूं। :-)

+0

मॉड्यूल के भीतर से लोडिंग ('dotsourcing') '.PS1' स्क्रिप्ट पर आपके विचार क्या हैं? यह [पेस्टर] है (https://github.com/pester/Pester/blob/master/Pester.psm1) दृष्टिकोण। – craig

+1

मुझे लगता है कि यह ठीक है। डॉट सोर्स स्क्रिप्ट को उस मॉड्यूल पर स्कॉप्ड किया जाएगा। –

5

अन्य उत्तरों के अलावा कुछ मॉड्यूल सुविधाएं।

  • PowerShell वी 3 एक में आदेश मॉड्यूल के निर्यात आदेशों का उपयोग करने में Import-Module कॉल करने के लिए नहीं है। यह विशेष रूप से उपयोगी होता है जब आदेशों का अंतःक्रियात्मक रूप से उपयोग किया जाता है। PowerShell किसी भी तरह कैश करता है और सभी उपलब्ध मॉड्यूल कमांड और यहां तक ​​कि उनकी सहायता Get-Help SomeCommand जानता है (हालांकि मॉड्यूल मदद Get-Help about_SomeModule के लिए यह सच नहीं है)।

  • डॉट-सोर्स किए गए कार्यों और स्क्रिप्ट मॉड्यूल फ़ंक्शंस के व्यवहार में कई सूक्ष्म मतभेद हैं। उन सभी को सूचीबद्ध करना आसान नहीं है, यहां केवल एक उदाहरण है: Strange behavior with Powershell scriptblock variable scope and modules, any suggestions? कभी-कभी स्क्रिप्ट मॉड्यूल का उपयोग दर्दनाक हो जाता है, खासकर जब कोई अवांछित मतभेदों और मुद्दों को बहुत देर से खोजता है, यानी सरल चीजें विकास की शुरुआत में ठीक काम करती हैं लेकिन जटिल चीजें शुरू होती हैं बाद में गलत जाने के लिए।

सब कुछ, आम तौर पर मैं मामलों को छोड़कर मॉड्यूल का उपयोग करता हूं जब वे अच्छी तरह से काम नहीं करते हैं। उनमें से एक स्क्रिप्ट मॉड्यूल कार्यों में पारित उपयोगकर्ता स्क्रिप्ट ब्लॉक का आह्वान कर रहा है।

+0

पावरहेल को एक टेक्स्ट फ़ाइल के बारे में कैसे पता चलेगा जिसे मैंने अभी बनाया है और इसे कुछ मॉड्यूल.पीएसएम 1 कहा है ?! क्या पावरहेल ऐसी फाइलों के लिए मेरे फाइल सिस्टम को स्थायी रूप से स्कैन करता है ?! –

+0

कुछ मौकों पर, पावरशेल मानक मॉड्यूल स्थानों को स्कैन करता है और नए और बदले मॉड्यूल को पढ़ता है और कैश करता है। जहां तक ​​मुझे पता है, विवरण दस्तावेज नहीं हैं। –

+1

जहां तक ​​मुझे पता है, पावरहेल केवल '$ Env: PSModulePath' द्वारा निर्दिष्ट फ़ोल्डर के अंदर फ़ाइलों की जांच करता है। (देखें [यहां] (https://msdn.microsoft.com/en-us/library/dd878350 (v = vs.85) .aspx)) –

संबंधित मुद्दे