Function 在PowerShell中查看嵌套的专用函数定义

Function 在PowerShell中查看嵌套的专用函数定义,function,reflection,powershell,module,Function,Reflection,Powershell,Module,PowerShell提供了一种查看函数内容的简单技术,例如 Get-Content function:MyFuncName # (A) 或同等地 (Get-ChildItem function:MyFuncName).definition # (B) 其中MyFuncName是我的函数名。这对于简单函数(即只使用基本语言构造而不调用其他函数的函数)非常有用。但是请考虑下面的函数 fo,其中包含对函数 bar 的调用。在典型场景中,这两个函数都包含在同一个模块中,该模块的公共API仅

PowerShell提供了一种查看函数内容的简单技术,例如

Get-Content function:MyFuncName   # (A)
或同等地

(Get-ChildItem function:MyFuncName).definition    # (B)
其中MyFuncName是我的函数名。这对于简单函数(即只使用基本语言构造而不调用其他函数的函数)非常有用。但是请考虑下面的函数<代码> fo<代码>,其中包含对函数<代码> bar <代码>的调用。在典型场景中,这两个函数都包含在同一个模块中,该模块的公共API仅包含函数
foo
,因此它是唯一导出的函数

function foo ()
{
    $p = bar "here"
    "result is '$p'"
}
function bar ([string] $s)
{
    $s + $s
}
Export-ModuleMember foo

是否有任何方法可以以与上述(a)或(B)类似的方式查看另一个函数中嵌套的非导出函数(如函数
bar
)?(也就是说,无需在编辑器中打开.psm1文件:-)

我不确定您是否可以为模块中的特定函数执行此操作,但可以为整个模块执行此操作:

Import-Module C:\Test.psm1
(Get-Module Test).Definition
我认为函数foo调用函数栏的事实直到运行时才知道

更新

有志者事竟成:-)以下是访问私有模块成员的方法。使用脚本块调用模块。在scriptblock内部,私有成员可见

Import-Module C:\Test.psm1
$module = Get-Module Test
& $module { (get-item function:bar).Definition }
感谢PowerTips:-)

更新2

在找到PowerTip的小片段后,我有点好奇到底发生了什么。。。代码段使用带有两个参数的调用运算符
&

  • 模块对象(
    System.Management.Automation.PSModuleInfo
  • 脚本块
  • 所以真正发生的是调用
    PSModuleInfo
    类型的
    Invoke
    方法。脚本块中的代码在与模块代码其余部分相同的会话状态下运行,因此它可以访问私有成员。此代码执行与PowerTip代码段完全相同的操作:

    $module = Get-Module Test
    $module.Invoke( { (get-item function:bar).Definition } )
    

    检查此处的invoke方法:

    否。您使用的方法是通过本地范围内的函数提供程序获取函数的定义。它将只看到已在本地范围中定义或在父范围中可见的函数


    调用函数时,它会在自己的作用域中运行。该函数创建的任何函数都将在该子作用域中创建,并且仅在该函数运行期间存在。当函数完成时,它运行的作用域将被处理,它创建的所有函数都将随之处理。

    我理解你的观点,但让我澄清一下。我不希望自动显示所有嵌套。相反,当我看到顶层函数时,我对自己说“好的,这个函数调用函数xyz。现在我想看看函数xyz。”但是
    gc函数:xyz
    将失败,因为它没有导出。很好的发现;谢谢你,安迪!请注意,较短的格式(我上面的格式A)也可以使用,即
    和$module{gc function:bar}
    作为配方的最后一行。