2015-12-10 5 views
6

मान लीजिए मैं एक साधारण PowerShell स्क्रिप्ट है:क्या PowerShell स्क्रिप्ट संकलित करता है?

1..3 | Write-Host 
  • कैसे PowerShell प्रक्रिया यह?
  • क्या यह मेमोरी असेंबली या कुछ अस्थायी .dll फ़ाइल बनाता है?
  • क्या मैं कुछ उपकरणों (जैसे ILSpy, VS, WinDbg) का उपयोग करके इस असेंबली और एमएसआईएल की जांच कर सकता हूं?
  • क्या पावरशेल फ़ाइल स्क्रिप्ट्स और आरईपीएल कमांड लाइन इनपुट की प्रसंस्करण का इलाज करता है (यानी संकलित/व्याख्या दोनों)?
  • क्या मैं इस संकलित असेंबली का उपयोग सी # और अन्य नेट भाषाओं के साथ कर सकता हूं?
  • क्या पीएस स्क्रिप्ट को मूल बाइनरी कोड में संकलित किया जा सकता है?
+3

पावरशेल एक व्याख्या की गई भाषा है (हाँ वी 3 ** आंतरिक रूप से कैश ** कुछ जेनरेट आईएल)। ऐसी असेंबली नहीं हैं तो आप उन्हें अन्य .NET भाषाओं के साथ _use_ नहीं कर सकते हैं, लेकिन निश्चित रूप से आप अपने .NET ऐप के भीतर PowerShell होस्ट कर सकते हैं (कुछ साझा भी कर सकते हैं!)। इसके बाद अन्य जवाब इसके परिणाम हैं। जांच के बारे में आईएल कैश ...ठीक है, निश्चित रूप से आईएलएसपी के साथ पीएस कोड का निरीक्षण करना और WinDbg का उपयोग करके आप लगभग हर चीज कर सकते हैं ... –

+0

यदि आपका लक्ष्य पावरशेल स्क्रिप्ट को निष्पादन योग्य के रूप में तैनात करना है तो आप इस प्रोजेक्ट को देखना चाहेंगे: https: // gallery.technet.microsoft.com/PS2EXE-Convert-PowerShell-9e4e07f1 –

उत्तर

9

पावरशेल वी 2 और पहले कभी एक स्क्रिप्ट संकलित नहीं किया गया था, इसे हमेशा पार्स पेड़ में आभासी "eval" विधियों के माध्यम से व्याख्या किया गया था।

पावरशेल वी 3 और बाद में पार्स पेड़ (अस्थ) को एक LINQ अभिव्यक्ति पेड़ में संकलित करें, जिसे तब बाइट कोड में संकलित किया गया है और बाइट कोड का अर्थ है।

यदि स्क्रिप्ट 16 बार निष्पादित की जाती है, तो स्क्रिप्ट पृष्ठभूमि में संकलित जिट है, और जैसे ही जिट पूर्ण हो जाता है, व्याख्या कोड का उपयोग नहीं किया जाएगा। लूप पर भी लागू होता है, यदि एक लूप 16 गुना पुनरावृत्त करता है, तो लूप बॉडी को जिट संकलित किया जाएगा और लूप बॉडी सबसे पहले संभव समय पर संकलित किए गए जिट से स्विच किया जाएगा।

किसी सदस्य को एक्सेस करने या सी # विधि का आह्वान करने जैसे कई ऑपरेशन हमेशा छोटे गतिशील तरीकों में संकलित होते हैं। इन गतिशील साइटों को PowerShell की गतिशील प्रकृति के लिए अनुकूलित किया जाता है, जो मांग पर विभिन्न प्रकार के इनपुट को अनुकूलित करते हैं।

जिट संकलित कोड "अज्ञात विधियों" असेंबली में होस्ट किया गया है और सहेजा नहीं जा सकता है। विंडबग के साथ, आप जेनरेट कोड के आईएल को अलग कर सकते हैं।

संकलित आईएल कोड को एक डीएल के रूप में सहेजना काफी संभव नहीं है क्योंकि जेनरेट कोड लाइव ऑब्जेक्ट्स पर निर्भर करता है। PowerShell के लिए यह कोड उत्पन्न करने के लिए तकनीकी रूप से संभव है जिसे एक डीएलएल के रूप में सहेजा जा सकता है, लेकिन यह लागू नहीं किया गया है।

स्क्रिप्ट और प्रतिकृति बिल्कुल वही काम करती है।

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

अन्य भाषाओं से पावरशेल स्क्रिप्ट को कॉल करने के लिए यह कुछ मुश्किल और अजीब होगा क्योंकि कई कारक - मुख्य रूप से पाइपलाइनिंग और पैरामीटर बाइंडिंग सामान्य विधि प्रेषण से कुछ हद तक भिन्न होती हैं।

आप सी # में पावरशेल स्क्रिप्ट से लौटाई गई वस्तुओं का उपयोग कर सकते हैं। वी 3 में शुरू करना, यदि आप सी # में गतिशील कीवर्ड का उपयोग करते हैं, तो आप किसी अन्य ऑब्जेक्ट की तरह PSObject पर गुणों, कॉल स्क्रिप्ट विधियों इत्यादि तक पहुंच सकते हैं। वी 3 से पहले, आपको psobj.Properties ['SomeProperty'] की तरह एपीआई का उपयोग करना पड़ा।

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