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

Tre*_*van 6 powershell powershell-3.0

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

考虑以下文件夹结构:

c:\Scripts\Test.ps1
c:\Scripts\Test1\Test1.ps1
c:\Scripts\Test2\Test2.ps1
Run Code Online (Sandbox Code Playgroud)

Test.ps1

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

Test1;
Test2;
Run Code Online (Sandbox Code Playgroud)

Test1.ps1

function Test1 {
    [CmdletBinding()]
    param (
    )
    Write-Host -Object "Entering Test1";
    Write-Host -Object "Exiting Test1";
}
Run Code Online (Sandbox Code Playgroud)

Test2.ps1

function Test2 {
    [CmdletBinding()]
    param (
    )
    Write-Host -Object "Test2";
    Write-Host -Object "Exiting Test2";
}
Run Code Online (Sandbox Code Playgroud)

我已经使用了各种关于性的尝试$PSCmdlet$MyInvocation自动变量,但似乎无法找到一个方法来获取到的路径定义函数,而不是通常是主叫所在的文件.

换句话说,当C:\Scripts\Test1\Test1.ps1Test1函数中调用时,我如何从函数内部获取路径Test.ps1?这同样适用于该Test2.ps1脚本,和Test2功能.我如何C:\Scripts\Test2\Test2.ps1Test2函数内部获取路径?

这是不可能的,因为我正在使用.呼叫运算符,将函数导入当前会话?

Sha*_*evy 13

这是另一种方法,使用函数的scriptblock File属性获取包含该函数的文件:

${function:Test1}.File
Run Code Online (Sandbox Code Playgroud)

  • 当然,变量符号有两个版本。“标准”:$var 和 ${var}。在后者中,变量名可以包含任何字符。一个例子是一个包含空格的变量名:${variable with space}。${} 是一个 get-content 等价物。函数的内容是它的定义或脚本块。ScriptBlocks 有一个 File 属性,其中填充了包含函数的文件名(假设函数来自文件)。相当于 ${function:test1}.File 将是: $func = Get-Command test1; $func.ScriptBlock.File (2认同)

小智 7

我认为$ PSCommandPath有你想要的东西.