Powershell中相当于python的if __name__ == '__main__':
我非常喜欢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
属性包含了执行时使用的脚本文本,当点源时,这个文本会以 ".
" 开头,但如果作为脚本运行就不会(显然,这种情况下可以用正则表达式来匹配,以允许在句点周围有可变的空白字符)。
在作为函数运行的脚本中