Powershell中相当于python的if __name__ == '__main__':

21 投票
4 回答
4292 浏览
提问于 2025-04-16 09:58

我非常喜欢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 个回答

2

目前我看到有两个可行的选项

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

还有

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

$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)'"
}
6

$MyInvocation 这个东西包含了很多关于当前上下文的信息,还有调用者的信息。也许可以用它来判断一个脚本是被点源(也就是被引入)还是直接执行。

一个脚本可以像函数一样工作:在文件中用 param 作为第一个非空白的内容来定义参数。不过,如果你点源一个以 param 开头的脚本,会发生什么就不太清楚了(需要尝试不同的组合来看看)。

模块不仅可以直接执行代码,还可以导出函数、变量等,并且可以接收参数。也许在模块中使用 $MyInvocation 可以帮助我们区分这两种情况。

补充说明:

$MyInvocation.Line 包含了执行当前脚本或函数时使用的命令行。它的 Line 属性包含了执行时使用的脚本文本,当点源时,这个文本会以 "." 开头,但如果作为脚本运行就不会(显然,这种情况下可以用正则表达式来匹配,以允许在句点周围有可变的空白字符)。

在作为函数运行的脚本中

撰写回答