19

我真的很喜欢 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

4 回答 4

7

$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)'"
}
于 2011-04-07T14:26:47.193 回答
6

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

脚本可以像函数一样工作:param用作文件中的第一个非通用/空格来定义参数。目前尚不清楚(需要尝试不同的组合)如果您对一个开始的脚本进行点源处理会发生什么param......

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

编辑:附加:

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

在作为函数运行的脚本中

于 2011-01-14T17:38:21.797 回答
2

截至目前,我看到 2 个可行的选项

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

if ($MyInvocation.CommandOrigin -eq 'Runspace') {#do main stuff}
于 2019-12-28T17:45:11.277 回答
1

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

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

用要点证明

于 2017-12-28T07:20:49.183 回答