如果__name__ =='__ main__',则为Powershell等效的python:

时间:2011-01-14 17:24:13

标签: powershell

我真的很喜欢python做这样的事情的能力:

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

这很好,因为我可以将Python脚本文件视为可以从命令行调用的东西,但它仍然可以将其函数和类轻松导入到单独的python脚本文件中,而不会触发默认的“运行”命令行行为“。

Powershell是否有类似的设施可以利用?如果不是,我应该如何组织我的函数文件库,这样我可以在开发它时轻松执行其中一些?

4 个答案:

答案 0 :(得分:5)

$MyInvocation有很多关于当前上下文和调用者的信息。也许这可以用来检测脚本是否是点源(即导入)或作为脚本执行。

脚本可以像函数一样:使用param作为文件中的第一个非公共/空格来定义参数。目前尚不清楚(一个人需要尝试不同的组合)如果你点源一个开始param的脚本会发生什么......

模块可以直接执行代码以及导出函数,变量......并且可以获取参数。也许模块中的$MyInvocation可以检测到两个案例。

编辑:补充:

$MyInvocation.Line包含用于执行当前脚本或函数的命令行。它的Line属性具有用于执行的脚本文本,当点源时它将以“.”开头,但如果作为脚本运行则不会(显然是使用正则表达式匹配来允许的情况)周期内的变量空白。)

在作为函数运行的脚本中

答案 1 :(得分: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)'"
}

答案 2 :(得分: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

答案 3 :(得分:0)

到目前为止,我看到2个有效的选项

if ($MyInvocation.InvocationName -ne '.') {#do main stuff}

if ($MyInvocation.CommandOrigin -eq 'Runspace') {#do main stuff}