【问题标题】:Get path to file that defines PowerShell function获取定义 PowerShell 函数的文件的路径
【发布时间】:2013-04-07 01:21:25
【问题描述】:

我正在尝试找出一种方法来获取定义 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.ps1Test2.ps1 脚本和 Test2 函数也是如此。如何从Test2 函数内部获取路径C:\Scripts\Test2\Test2.ps1

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

【问题讨论】:

    标签: powershell powershell-3.0


    【解决方案1】:

    这里还有一种方法,使用函数的 scriptblock File 属性获取包含函数的文件:

    ${function:Test1}.File
    

    【讨论】:

    • 好电话,不需要 PSv3。
    • Shay,你能进一步解释一下吗?看起来您正在使用变量表示法获取函数?
    • 当然,变量表示法有两个版本。 “标准”:$var 和 ${var}。在后者中,变量名可以包含任何字符。一个示例是包含空格的变量名:${带空格的变量}。 ${} 是一个获取内容的等价物。函数的内容是它的定义或脚本块。 ScriptBlocks 有一个 File 属性,该属性填充了包含函数的文件名(假设函数来自文件)。 ${function:test1}.File 的等价物是: $func = Get-Command test1; $func.ScriptBlock.File
    【解决方案2】:

    我认为 $PSCommandPath 有你要找的东西。

    【讨论】:

    • 布拉格!你是对的,先生!很难跟踪......我希望他们能用$PSCmdlet 变量或其他东西将它拉起来。
    • 您能举例说明如何调用该系统变量吗?
    猜你喜欢
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2018-08-29
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多