2011-01-14 29 views
11

我真的很喜歡Python的做這樣的事情能力:Powershell的equivilent:

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

這是很好的,因爲我可以把一個Python腳本文件的東西,可以可以從命令行調用,但它仍然可供我將其函數和類輕鬆導入到單獨的python腳本文件中,而不會觸發默認的「從命令行行爲運行」。

Powershell有類似的設施,我可以利用?如果不是,我應該如何組織我的函數文件庫,以便在開發它們時輕鬆地執行其中的一些?

回答

5

$MyInvocation有大量關於當前上下文和調用者的信息。也許這可以用來檢測腳本是否被點源(即導入)或作爲腳本執行。

腳本可以像一個函數一樣工作:使用param作爲文件中第一個非常見/空白的空格來定義參數。目前還不清楚(你需要嘗試不同的組合)如果你點擊一個開始的腳本,會發生什麼情況param ...

模塊可以直接執行代碼以及導出函數,變量......並且可以參數。模塊中的$MyInvocation可能會允許檢測到兩種情況。

EDIT:其他:

$MyInvocation.Line包含用於執行當前腳本或功能的命令行。它的Line屬性具有用於執行的腳本文本,點源時,它將以「.」開頭,但如果作爲腳本運行(顯然是使用正則表達式匹配以允許周圍的變量空白),則不會。

在腳本中運行的功能

+0

所以沿着線的東西: 如果(! 「」 $ MyInvocation.Line.Trim()StartsWith()){ #Scripty類型的調用發生在這裏 } – 2011-01-14 18:59:25

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

聲明:僅在Linux上的Powershell Core上進行測試。它可能不適用於Windows。如果有人在Windows上試用它,我將不勝感激,如果你可以在評論中驗證。

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

Demonstrated with a gist