在 PowerShell 中查看嵌套的私有函数定义

Mic*_*ens 4 reflection powershell module function

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

Get-Content function:MyFuncName   # (A)
Run Code Online (Sandbox Code Playgroud)

或等效地

(Get-ChildItem function:MyFuncName).definition    # (B)
Run Code Online (Sandbox Code Playgroud)

其中MyFuncName是我的函数的名称。这对于简单的函数(即只使用基本语言结构而不调用其他函数的函数)来说非常有用。但是考虑foo下面显示的包含对函数的调用的函数bar。在典型情况下,它们都包含在同一模块中,其公共 API 仅由函数组成foo,因此它是唯一导出的函数。

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

有没有办法以bar与上述 (A) 或 (B) 相当的方式查看另一个函数中的嵌套、非导出函数(如 function )?(也就是说,无需在编辑器中打开 .psm1 文件:-)

And*_*ndi 5

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

Import-Module C:\Test.psm1
(Get-Module Test).Definition
Run Code Online (Sandbox Code Playgroud)

我认为函数 foo 调用函数 bar 的事实直到运行时才知道。

更新

有意愿,就有方法 :-) 以下是访问私有模块成员的方法。使用脚本块调用模块。在脚本块内,私有成员是可见的。

Import-Module C:\Test.psm1
$module = Get-Module Test
& $module { (get-item function:bar).Definition }
Run Code Online (Sandbox Code Playgroud)

感谢 PowerTips :-) http://powershell.com/cs/blogs/tips/archive/2009/09/18/accessing-hidden-module-members.aspx

更新 2

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

  1. 模块对象 (System.Management.Automation.PSModuleInfo )
  2. 一个脚本块

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

$module = Get-Module Test
$module.Invoke( { (get-item function:bar).Definition } )
Run Code Online (Sandbox Code Playgroud)

在此处查看调用方法:http : //msdn.microsoft.com/en-us/library/system.management.automation.psmoduleinfo.invoke(v=vs.85).aspx