2009-07-14 7 views
5

यहां एक उदाहरण है:मैं गतिशील रूप से उन कार्यों को कैसे बना सकता हूं जो माता-पिता के दायरे में पहुंच योग्य हैं?

function ChildF() 
{ 
    #Creating new function dynamically 
    $DynFEx = 
@" 
    function DynF() 
    { 
    "Hello DynF" 
    } 
"@ 
    Invoke-Expression $DynFEx 
    #Calling in ChildF scope Works 
    DynF 
} 
ChildF 
#Calling in parent scope doesn't. It doesn't exist here 
DynF 

मैं सोच रहा था कि क्या आप DynF को इस तरह से परिभाषित कर सकते हैं कि यह चाइल्डएफ के बाहर "दृश्यमान" है।

उत्तर

6

अन्य समाधान विशिष्ट प्रश्न के बेहतर उत्तर हैं। जैसा कि कहा गया है, यह वैश्विक चर बनाने का सबसे सामान्य तरीका जानने के लिए अच्छा है:

# inner scope 
Set-Variable -name DynFEx -value 'function DynF() {"Hello DynF"}' -scope global 

# somewhere other scope 
Invoke-Expression $dynfex 
DynF 

पढ़ें 'मदद about_Scopes' टन अधिक जानकारी के लिए।

8

आप कर सकते हैं गुंजाइश global कीवर्ड के साथ समारोह:

function global:DynF {...} 
+0

ऊपर दिए गए कोड में, 'वैश्विक कार्य करें: DynF {...}' शायद अधिक समझ में आता है। ;-)। –

+0

सुधार के लिए धन्यवाद! मैं धागे को संपादित करूंगा। –

13

एक अन्य विकल्प Set-Item -Path function:global:ChildFunction -Value {...}

Set-Item उपयोग करके, आप के लिए मूल्य के लिए या तो एक स्ट्रिंग या एक स्क्रिप्ट ब्लॉक पारित कर सकते हैं उपयोग करने के लिए किया जाएगा समारोह की परिभाषा।

+1

'-Value' पर _script block_ को पास करना बहुत अच्छा काम करता है, लेकिन _string_ को पास करने के रूप में _not_ काम करने का इरादा है: जबकि 'सेट-आइटम' इसे स्वीकार करता है, फ़ंक्शन का आह्वान करता है, फिर घुमावदार ब्रेसिज़ के साथ परिभाषा स्ट्रिंग को केवल _echoes_ करता है। आप '&' के साथ उस पर काम कर सकते हैं, लेकिन यह अजीब है और मुझे यकीन नहीं है कि इसका दुष्प्रभाव है (उदाहरण के लिए, 'सेट-आइटम फ़ंक्शन: foo "और {' arg 0: '+' $ args [0]} '@args"; foo 'hi'' - यदि आपको स्ट्रिंग में फ़ंक्शन बॉडी बनाने की आवश्यकता है तो' Invoke-Expression' का उपयोग करना बेहतर होगा। – mklement0

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

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