Function 在PowerShell中查看嵌套的专用函数定义
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仅
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}
作为配方的最后一行。