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

发布于 2025-01-07 13:11:20 字数 673 浏览 0 评论 0原文

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 文件:-)

PowerShell provides a simple technique to view the contents of a function, e.g.

Get-Content function:MyFuncName   # (A)

or equivalently

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

where MyFuncName is the name of my function. That is great for simple functions (i.e. functions that use only base language constructs and do not call other functions). But consider the function foo shown below that contains a call to the function bar. In a typical scenario these would both be contained in the same module whose public API consists solely of the function foo and thus it is the only function exported.

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

Is there any way to view the nested, non-exported functions (like function bar) within another function in a fashion comparable to (A) or (B) above? (That is, without opening the .psm1 file in an editor :-)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝礼 2025-01-14 13:11:20

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

Import-Module C:\Test.psm1
(Get-Module Test).Definition

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

更新

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

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. 一个脚本块

所以真正发生的是 PSModuleInfo 类型的 Invoke 方法是被召唤。脚本块中的代码与模块代码的其余部分在相同的会话状态下运行,因此它可以访问私有成员。此代码与 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

I'm not sure if you can do it for a particular function in a module but you can do it for the whole module:

Import-Module C:\Test.psm1
(Get-Module Test).Definition

I think the fact that function foo calls function bar is not known until runtime.

Update

Where there's a will, there's a way :-) Here's how you can access private module members. Invoke the module with a scriptblock. Inside the scriptblock the private members are visible.

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

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

Update 2

After finding the little PowerTip snippet I was kinda curious what was really going on... The snippet uses the call operator & with two arguments.

  1. The module object (System.Management.Automation.PSModuleInfo)
  2. A script block

So what's really going on is the Invoke method of the PSModuleInfo type is being called. The code in the script block runs within the same session state as the rest of the module code so it has access to the private members. This code does the exact same thing as the PowerTip snippet:

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

Check out the invoke method here: http://msdn.microsoft.com/en-us/library/system.management.automation.psmoduleinfo.invoke(v=vs.85).aspx

原来分手还会想你 2025-01-14 13:11:20

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

当你调用一个函数时,它在它自己的作用域中运行。该函数创建的任何函数都将在该子作用域中创建,并且仅在该函数运行期间存在。当函数完成后,它运行的作用域将被释放,它创建的所有函数也随之消失。

No. The method you're using is getting the definition of the function via the function provider in the local scope. It will only see functions that have been defined in the local scope or that are visible in parent scopes.

When you call a function, it runs in it's own scope. Any functions the function creates will be created in that child scope, and only exist during the time that function is running. When the function is done, the scope it was running it gets disposed of, and all the functions it created go with it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文