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

时间:2010-09-11 02:25:49

标签: function reflection powershell

例如:

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

输出:

PS > Foo
This function is called foo

4 个答案:

答案 0 :(得分:28)

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

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

答案 1 :(得分:5)

当您在某个功能中时,您可以访问自动变量$ PSCmdLet

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

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

易。

For i = 2 To lstrow
    Exam_1_Date = Worksheets("Data").Range("AW" & i)
    Exam_2_Date = Worksheets("Data").Range("BA" & i)

    If Exam_1_Date > Exam_2_Date Then
        Worksheets("PPDCI").Range("A" & j & ":C" & j).Value = Worksheets("Data").Range("F" & i & ":H" & i).Value
        Worksheets("PPDCI").Range("F" & j).Value = Exam_1_Date
    ElseIf Exam_1_Date < Exam_2_Date Then
        Worksheets("PPDCI").Range("A" & j & ":C" & j).Value = Worksheets("Data").Range("F" & i & ":H" & i).Value
        Worksheets("PPDCI").Range("F" & j).Value = Exam_2_Date
    Else
        Worksheets("PPDCI").Range("F" & j).Value = "CAN NOT DETERMINE"
    End If
    j = j + 1
Next i

默认情况下,示例中的 Get-FunctionName 将获取调用它的函数的名称。

function Get-FunctionName ([int]$StackNumber = 1) {
    return [string]$(Get-PSCallStack)[$StackNumber].FunctionName
}

增加 StackNumber 参数将获得下一个函数调用的名称。

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