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

时间:2012-02-21 17:39:47

标签: function reflection powershell module

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

Get-Content function:MyFuncName   # (A)

或等效

(Get-ChildItem function:MyFuncName).definition    # (B)

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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 :-) http://powershell.com/cs/blogs/tips/archive/2009/09/18/accessing-hidden-module-members.aspx

更新2

在找到小PowerTip片段之后,我有点好奇真正发生的事情......该片段使用带有两个参数的调用操作符&

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

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

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

答案 1 :(得分:0)

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

当你调用一个函数时,它会在它自己的范围内运行。函数创建的任何函数都将在该子作用域中创建,并且仅在函数运行期间存在。当函数完成后,它运行它的范围就会被处理掉,它创建的所有函数都随之而来。