2011-01-14 28 views
11

Tôi thực sự thích khả năng python để làm những việc như thế này:Powershell equivilent của của python nếu __name__ == '__main__':

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

này là tốt đẹp vì tôi có thể đối xử với một file Python script như một cái gì đó có thể được gọi từ dòng lệnh nhưng nó vẫn có sẵn cho tôi để nhập các hàm và các lớp của nó vào một tệp kịch bản python riêng biệt một cách dễ dàng mà không kích hoạt mặc định "chạy từ hành vi dòng lệnh".

Powershell có cơ sở tương tự mà tôi có thể khai thác không? Và nếu nó không làm thế nào tôi nên tổ chức thư viện của tôi về các tập tin chức năng để tôi có thể dễ dàng thực hiện một số trong số họ trong khi tôi đang phát triển chúng?

Trả lời

5

$MyInvocation có nhiều thông tin về ngữ cảnh hiện tại và thông tin của người gọi. Có thể điều này có thể được sử dụng để phát hiện xem tập lệnh có phải là dấu chấm có nguồn gốc hay không (được nhập) hoặc được thực thi dưới dạng tập lệnh.

Một tập lệnh có thể hoạt động như một hàm: sử dụng param làm dấu cách/không gian trắng đầu tiên trong tệp để xác định tham số. Nó không rõ ràng (người ta sẽ cần phải thử các kết hợp khác nhau) điều gì xảy ra nếu bạn dot-source một tập lệnh bắt đầu param ...

Mô-đun có thể thực thi trực tiếp mã cũng như chức năng xuất, biến, ... và có thể lấy tham số. Có lẽ $MyInvocation trong một mô-đun sẽ cho phép hai trường hợp được phát hiện.

EDIT: bổ sung:

$MyInvocation.Line chứa các dòng lệnh sử dụng để thực thi kịch bản hay chức năng hiện hành. Thuộc tính Line của nó có văn bản scrip được sử dụng để thực hiện, khi dot-tìm nguồn cung ứng này sẽ bắt đầu bằng "." nhưng không phải nếu chạy dưới dạng tập lệnh (rõ ràng là trường hợp sử dụng đối sánh regex để cho phép khoảng trắng biến xung quanh dấu chấm).

Trong tập lệnh chạy dưới dạng hàm

+0

Vì vậy, một cái gì đó dọc theo dòng: if (!. "" $ MyInvocation.Line.Trim() StartsWith()) { #Scripty loại gọi xảy ra ở đây } –

+0

+ 1 để sử dụng các module powerhell v2.0. – x0n

+0

@MarkMascolino: sau khi thử nghiệm nhanh, có thể có '. tập lệnh', không chỉ là một không gian. Tôi sẽ sử dụng '-match '^ \ s + \. \ S +''. – Richard

2

$MyInvocation.Invocation có thông tin về cách tập lệnh được bắt đầu.

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

Tuyên bố từ chối trách nhiệm: Điều này chỉ được thử nghiệm trên Powershell Core trên Linux. Nó có thể không hoạt động tương tự cho Windows. Nếu ai đó thử nó trên Windows, tôi sẽ đánh giá cao nếu bạn có thể xác minh trong các ý kiến.

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

Demonstrated with a gist

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