2009-07-14 32 views
5

Dưới đây là một ví dụ:Làm cách nào để tự động tạo các hàm có thể truy cập trong phạm vi cấp độ gốc?

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 

tôi đã tự hỏi liệu bạn có thể xác định DynF theo một cách như vậy mà nó là "nhìn thấy" bên ngoài của ChildF.

Trả lời

6

Các giải pháp khác là câu trả lời tốt hơn cho câu hỏi cụ thể. Điều đó nói rằng, tốt nhất là tìm hiểu cách tổng quát nhất để tạo các biến toàn cầu:

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

# somewhere other scope 
Invoke-Expression $dynfex 
DynF 

Đọc 'help about_Scopes' để biết thêm thông tin.

8

Bạn có thể phạm vi chức năng với global keyword:

function global:DynF {...} 
+0

Trong mã đã cho ở trên, 'hàm toàn cục: DynF {...}' có thể có ý nghĩa hơn. ;-). –

+0

Cảm ơn bạn đã sửa! Tôi sẽ chỉnh sửa chuỗi. –

13

Một lựa chọn khác là sử dụng các Set-Item -Path function:global:ChildFunction -Value {...}

Sử dụng Set-Item, bạn có thể vượt qua hoặc là một chuỗi hoặc một khối kịch bản để giá trị cho định nghĩa của hàm.

+1

Việc truyền _script block_ sang '-Value' hoạt động tốt, nhưng việc truyền _string_ hiện _not_ hoạt động như dự định: trong khi' Set-Item' chấp nhận nó, gọi hàm sau đó chỉ _echoes_ chuỗi định nghĩa với các dấu ngoặc nhọn bị tước. Bạn có thể làm việc xung quanh đó với '&', nhưng nó khó xử và tôi không chắc nó có tác dụng phụ hay không (ví dụ, 'hàm item-set: foo" & {'arg 0:' + '$ args [0]} '@args"; foo 'hi'' - tốt hơn để sử dụng 'Invoke-Expression' nếu bạn cần xây dựng phần thân hàm trong một chuỗi. – mklement0

Các vấn đề liên quan