2011-01-14 47 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

相关问题