2011-01-14 12 views
11

मैं इस तरह काम करने के लिए अजगर की क्षमता का सच शौकीन हूँ:Powershell बराबर:

if __name__ == '__main__': 
    #setup testing code here 
    #or setup a call a function with parameters and human format the output 
    #etc... 

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

क्या पावरहेल की एक समान सुविधा है जिसका मैं शोषण कर सकता हूं? और अगर ऐसा नहीं होता है कि मैं फ़ंक्शन फ़ाइलों की अपनी लाइब्रेरी को कैसे व्यवस्थित करूँ? ताकि जब मैं उन्हें विकसित कर रहा हूं तो मैं उनमें से कुछ को आसानी से निष्पादित कर सकता हूं?

उत्तर

5

$MyInvocation में वर्तमान संदर्भ और कॉलर्स के बारे में बहुत सारी जानकारी है। हो सकता है कि इसका उपयोग यह पता लगाने के लिए किया जा सके कि क्या एक स्क्रिप्ट डॉट-सोर्स किया गया है (यानी आयात किया गया है) या स्क्रिप्ट के रूप में निष्पादित किया गया है।

एक स्क्रिप्ट फ़ंक्शन की तरह कार्य कर सकती है: param का उपयोग परिभाषित पैरामीटर में फ़ाइल में पहले गैर-सामान्य/व्हाइटस्पेस के रूप में करें। यह स्पष्ट नहीं है (किसी को अलग-अलग संयोजनों को आजमाने की आवश्यकता होगी) क्या होता है यदि आप param से शुरू होने वाली स्क्रिप्ट को डॉट-स्रोत करते हैं ...

मॉड्यूल सीधे कोड के साथ ही निर्यात कार्यों, चर, ... और कर सकते हैं पैरामीटर ले लो। शायद मॉड्यूल में $MyInvocation दो मामलों को पहचानने की अनुमति देगा।

संपादित करें: अतिरिक्त:

$MyInvocation.Line आदेश वर्तमान स्क्रिप्ट या समारोह निष्पादित करने के लिए इस्तेमाल किया पंक्ति है। इसकी Line संपत्ति में निष्पादन के लिए उपयोग किया जाने वाला स्क्रिप टेक्स्ट होता है, जब यह डॉट-सोर्सिंग "." से शुरू होगा, लेकिन यदि स्क्रिप्ट के रूप में नहीं चलता है (जाहिर है कि अवधि के दौरान परिवर्तनीय सफेद स्थान की अनुमति देने के लिए रेगेक्स मैच का उपयोग करने का मामला)।

एक स्क्रिप्ट में एक समारोह

+0

तो की तर्ज पर कुछ: if (!। "।" $ MyInvocation.Line.Trim() StartsWith()) { #Scripty प्रकार मंगलाचरण यहां होता } –

+0

+ 1 शक्तिशक्ति v2.0 मॉड्यूल का उपयोग करने के लिए। – x0n

+0

@ मार्कमास्कोलिनो: त्वरित परीक्षण के बाद, 'हो सकता है। स्क्रिप्ट ', न केवल एक जगह। मैं '-match '^ \ s + \। \ S +'' का उपयोग करूंगा। – Richard

2

$MyInvocation.Invocation के बारे में कैसे स्क्रिप्ट शुरू किया गया था जानकारी नहीं है के रूप में चलाते हैं।

If ($MyInvocation.InvocationName -eq '&') { 
    "Called using operator: '$($MyInvocation.InvocationName)'" 
} ElseIf ($MyInvocation.InvocationName -eq '.') { 
    "Dot sourced: '$($MyInvocation.InvocationName)'" 
} ElseIf ((Resolve-Path -Path $MyInvocation.InvocationName).ProviderPath -eq $MyInvocation.MyCommand.Path) { 
    "Called using path: '$($MyInvocation.InvocationName)'" 
} 
0

अस्वीकरण: यह केवल लिनक्स पर पावरहेल कोर पर परीक्षण किया जाता है। यह विंडोज के लिए भी काम नहीं कर सकता है। यदि कोई इसे विंडोज़ पर कोशिश करता है तो मैं सराहना करता हूं अगर आप टिप्पणियों में सत्यापित कर सकते हैं।

function IsMain() { 
    (Get-Variable MyInvocation -Scope Local).Value.PSCommandPath -Eq (Get-Variable MyInvocation -Scope Global).Value.InvocationName 
} 

Demonstrated with a gist