【问题标题】:Powershell equivalent of python's if __name__ == '__main__':Powershell 等效于 python 的 if __name__ == '__main__':
【发布时间】:2011-06-09 07:12:18
【问题描述】:

我真的很喜欢 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 是否有类似的工具可供我利用?如果没有,我应该如何组织我的函数文件库,以便我可以在开发它们时轻松执行其中的一些?

【问题讨论】:

    标签: python powershell language-comparisons


    【解决方案1】:

    $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】:

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

      脚本可以像函数一样工作:使用param 作为文件中的第一个非常见/空白来定义参数。目前尚不清楚(需要尝试不同的组合)如果您对以 param 开头的脚本进行 dot-source 会发生什么...

      模块可以直接执行代码,也可以导出函数、变量……并且可以带参数。也许模块中的$MyInvocation 可以检测到这两种情况。

      编辑:附加:

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

      在脚本中作为函数运行

      【讨论】:

      • 所以类似于: if (! $MyInvocation.Line.Trim().StartsWith(". ")) { #Scripty type invocation occurred here }
      • @MarkMascolino:经过快速测试,可以有.<tab>script,而不仅仅是一个空格。我会使用-match '^\s+\.\s+'
      【解决方案3】:

      到目前为止,我看到了 2 个可行的选项

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

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

      【讨论】:

        【解决方案4】:

        免责声明:这仅在 Linux 上的 Powershell Core 上进行了测试。它可能不适用于 Windows。如果有人在 Windows 上尝试过,如果您能在 cmets 中进行验证,我将不胜感激。

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

        Demonstrated with a gist

        【讨论】:

        • 这在 Windows 10 VM 中对我有用,$PSVersionTable:PSVersion = 5.1.17763.107
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2011-01-15
        • 2015-11-13
        • 1970-01-01
        • 2011-06-26
        相关资源
        最近更新 更多