我真的很喜欢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有类似的设施,我可以利用吗?如果不是,我应该如何组织我的函数文件库,这样我可以在开发它时轻松执行其中的一些?
$MyInvocation
有很多关于当前背景和呼叫者的信息。也许这可以用于检测脚本是否是点源(即导入)或作为脚本执行。
脚本可以像函数一样:使用param
作为文件中的第一个非公共/空格来定义参数。目前尚不清楚(需要尝试不同的组合)如果你点源一个启动param
的脚本会发生什么......
模块可以直接执行代码以及导出函数,变量......并且可以获取参数。也许模块中的$MyInvocation
可以检测到两个案例。
编辑:附加:
$MyInvocation.Line
包含用于执行当前脚本或函数的命令行。它的Line
属性具有用于执行的脚本文本,当点源时它将以“.
”开头,但如果作为脚本运行则不会(显然是使用正则表达式匹配以允许周期内的变量空格)。
在作为函数运行的脚本中
$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)'"
}
免责声明:这仅在Linux上的Powershell Core上进行了测试。对于Windows,它可能无法正常工作。如果有人在Windows上尝试它,我将不胜感激,如果你可以在评论中验证。
function IsMain() {
(Get-Variable MyInvocation -Scope Local).Value.PSCommandPath -Eq (Get-Variable MyInvocation -Scope Global).Value.InvocationName
}