【发布时间】:2011-04-04 09:33:17
【问题描述】:
我一直在玩 powershell 的动态功能,我想知道一些事情
powershell 中是否有任何类似于 Ruby 的 method_missing() 的功能,您可以在其中设置“捕获所有方法”来动态处理对对象上不存在的方法的调用?
【问题讨论】:
标签: powershell metaprogramming method-missing
我一直在玩 powershell 的动态功能,我想知道一些事情
powershell 中是否有任何类似于 Ruby 的 method_missing() 的功能,您可以在其中设置“捕获所有方法”来动态处理对对象上不存在的方法的调用?
【问题讨论】:
标签: powershell metaprogramming method-missing
你可以模仿它,但这很棘手。 Lee Holmes 书中描述了该技术,并归结为两个脚本 - Add-RelativePathCapture http://poshcode.org/2131 和 New-CommandWrapper http://poshcode.org/2197。
本质是 - 您可以通过 New-CommandWrapper 覆盖任何 cmdlet。因此,您可以重新定义在几乎每个命令末尾隐式调用的 Out-Default(不包括带有显式格式化程序的命令,例如末尾的 Format-Table)。在新的 Out-Default 中,您检查最后一个命令是否抛出异常,说明没有找到方法/属性。然后在那里插入你的 method_missing 逻辑。
【讨论】:
不,不是真的。我怀疑 PowerShell 的下一个版本将更符合添加到 .NET 4 的动态调度功能,但目前这在纯 PowerShell 中是不可能的。
虽然我记得有一个类似于 .NET 的 TypeDescriptor 中的组件模型,用于创建为 PowerShell 动态提供属性和方法的对象。例如,这就是如何将 XML 元素视为对象的方式。但是,如果根本没有记录,并且根据我的经验,需要集成的许多类型/方法都标记为内部。
【讨论】:
您可以在 Powershell 2.0 中使用 Try Catch
http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/11/hey-scripting-guy-march-11-2010.aspx
【讨论】: