获取定义PowerShell函数的文件路径

8

我试图找到一种方法来获取PowerShell 函数的文件路径(例如Test1或Test2),而不是调用者的路径,后者可以通过$PSScriptRoot自动变量轻松获得。

考虑以下文件夹结构:

c:\Scripts\Test.ps1
c:\Scripts\Test1\Test1.ps1
c:\Scripts\Test2\Test2.ps1

Test.ps1

Set-Location $PSScriptRoot;
. .\Test1\Test1.ps1;
. .\Test2\Test2.ps1;

Test1;
Test2;

Test1.ps1

function Test1 {
    [CmdletBinding()]
    param (
    )
    Write-Host -Object "Entering Test1";
    Write-Host -Object "Exiting Test1";
}

Test2.ps1

function Test2 {
    [CmdletBinding()]
    param (
    )
    Write-Host -Object "Test2";
    Write-Host -Object "Exiting Test2";
}

我尝试使用$PSCmdlet$MyInvocation自动变量的各种属性,但似乎找不到一种方法来获取函数定义所在文件的路径,而非调用者所在路径。

换句话说,当从Test.ps1调用Test1函数时,我如何从函数内部获取路径C:\Scripts\Test1\Test1.ps1?对于Test2.ps1脚本和Test2函数也是同样的问题。当从函数Test2内部获取路径C:\Scripts\Test2\Test2.ps1时,我该怎么做?
这是否因为我使用了.调用运算符将函数导入到当前会话中而无法实现?
2个回答

19

还有一种方法,使用函数的脚本块文件属性获取包含该函数的文件:

${function:Test1}.File

1
好的调用,不需要PSv3。 - Andy Arismendi
Shay,请问你能进一步解释一下吗?看起来你是在使用变量符号获取函数? - user189198
2
当然,变量符号有两个版本。 "标准":$var 和 ${var}。在后者中,变量名称可以包含任何字符。一个例子是包含空格的变量名:${variable with spaces}。 ${} 是一个获取内容等效项。函数的内容是其定义或脚本块。脚本块具有一个文件属性,其中填充了包含该函数的文件名(假设该函数来自文件)。${function:test1}.File 的等效项将是:$func = Get-Command test1; $func.ScriptBlock.File - Shay Levy

9
我认为$PSCommandPath包含了你所需要的信息。

啊!您是正确的,先生!很难跟踪...我希望他们能将其与$PSCmdlet变量捆绑在一起,或者做些什么。 - user189198
你能展示一下如何调用那个系统变量的例子吗? - Timo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接