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 文件:-)
我不确定您是否可以为模块中的特定功能执行此操作,但您可以为整个模块执行此操作:
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 小片段后,我有点好奇到底发生了什么……该片段使用&带有两个参数的调用运算符。
System.Management.Automation.PSModuleInfo )所以真正发生Invoke的PSModuleInfo是正在调用类型的方法。脚本块中的代码与模块代码的其余部分在相同的会话状态中运行,因此它可以访问私有成员。此代码与 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
| 归档时间: |
|
| 查看次数: |
1440 次 |
| 最近记录: |