Function 有没有办法从函数中检索PowerShell函数名?

Function 有没有办法从函数中检索PowerShell函数名?,function,reflection,powershell,Function,Reflection,Powershell,例如: function Foo { [string]$functionName = commandRetrievesFoo Write-Host "This function is called $functionName" } 输出: PS > Foo This function is called foo 您可以使用$MyInvocation,其中包含一些关于当前执行内容的有用信息 function foo { 'This function is cal

例如:

function Foo { 
    [string]$functionName = commandRetrievesFoo
    Write-Host "This function is called $functionName"
}
输出:

PS > Foo
This function is called foo

您可以使用
$MyInvocation
,其中包含一些关于当前执行内容的有用信息

function foo {
    'This function is called {0}.' -f $MyInvocation.MyCommand
}

Get PSCallStack
选项似乎只工作一次:从脚本主体调用函数时,第一次它将检索脚本名称,但第二次它将检索文本“”

当您在函数中时,您可以访问自动变量$

这是一个非常有用的变量,其中包含有关当前正在执行的cmdlet的大量信息

在我们的场景中,我们需要一些递归的当前函数的名称和定义$MyInvocation为null,因为该函数位于PowerShell模块内

但是,PSCmdLet对象上有一个“MyInvocation”属性,它包含所需的所有信息,并允许我们的场景运行

e、 g。 $PSCmdlet.MyInvocation.MyCommand.Name=函数的名称 $PSCmdlet.MyInvocation.MyCommand.Definition=函数的定义

function Get-FunctionName ([int]$StackNumber = 1) {
    return [string]$(Get-PSCallStack)[$StackNumber].FunctionName
}
默认情况下,示例中的Get FunctionName将获取调用它的函数的名称

Function get-foo () {
    Get-FunctionName
}
get-foo
#Reutrns 'get-foo'
增加StackNumber参数将获得下一次函数调用的名称

Function get-foo () {
    Get-FunctionName -StackNumber 2
}
Function get-Bar  () {
    get-foo 
}
get-Bar 
#Reutrns 'get-Bar'

这很有效-谢谢你知道如何获取调用函数名吗?我尝试了其他$myInvocation属性,但没有看到。函数foo{'此函数名为{0}.-f$MyInvocation.MyCommand'此调用程序名为{0}.-f$MyInvocation.?}函数CallFoo{foo}CallFoo如果您在PowerShell 2.0上,请使用
(Get-PSCallStack)[1]。命令
。将此问题作为单独的问题,以便人们可以找到它。v1中的答案在
gv-sc$\umyinvocation
中。请看,我遇到了两种获取调用函数名的方法:1)
(Get PSCallStack | Select Object FunctionName-Skip 1-First 1).FunctionName
和2)
(Get Variable MyInvocation-Scope 1).Value.MyCommand.name
。我试着在一个循环中运行每一个1000次,看看每一个都花了多长时间。获取变量。。。方法大约花费Get-PSCallStack的一半时间。。。方法。
$MyInvocation
不能用于获取类中函数的名称。为此,我需要使用
Get-PSCallStack)[0]。FunctionName
$PSCmdlet
仅当函数具有显式的
[CmdletBinding()]
属性时才显示有效。$PSCmdlet的条目表示
包含表示正在运行的cmdlet或高级函数的对象。因此,它只适用于具有CmdletBindingAttribute的高级函数,而不是普通函数。对我来说,它似乎是可重复的,每次调用时都返回调用堆栈。我想找到调用函数的名称,使用Get-PSCallStack似乎是一种方法;Jay Bazuzi链接中的方法没有给我调用函数名。对于其他人,我使用
getpscallstack |选择Object FunctionName-Skip 1-First 1
来获取调用函数的名称。如果从顶级脚本调用当前函数,则返回“”。