PowerShell中如何引用Cmdlet本身而非执行该Cmdlet?
如何在PowerShell中引用Cmdlet本身以研究其特性
我正在使用PowerShell 7.4学习PowerShell基础,想查看表达式的类型,比如执行:
[PowerShell] | gm
得到:
TypeName: System.RuntimeType
或者执行:
[PowerShell].GetType()
得到:
IsPublic IsSerial Name BaseType -------- -------- ---- -------- False False RuntimeType System.Reflection.TypeInfo
但无法获取Cmdlet本身的类型,因为直接调用Cmdlet会自动执行,比如:
Get-Help | gm
返回的是Cmdlet输出对象的成员,而非Cmdlet自身的成员。
我尝试执行:
(Get-Command Get-Help).GetType()
得到:
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False CmdletInfo System.Management.Automation.CommandInfo
可见Get-Command返回的是CmdletInfo对象,而非Cmdlet类型对象。根据PowerShell SDK,Cmdlet的基类是System.Management.Automation.Cmdlet:
[System.Management.Automation.Cmdlet]
输出:
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False Cmdlet System.Management.Automation.Internal.InternalCommand
解决方法
要获取Cmdlet本身的.NET类型,需通过CmdletInfo对象的ImplementingType属性,该属性存储了Cmdlet的实际实现类:
- 获取指定Cmdlet的实现类型:
# 获取Get-Help的实际实现类型 (Get-Command Get-Help).ImplementingType
输出示例:
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False GetHelpCommand System.Management.Automation.Cmdlet
- 查看该Cmdlet类型的成员(方法、属性等):
(Get-Command Get-Help).ImplementingType | Get-Member
- 若要查看所有Cmdlet的基类
System.Management.Automation.Cmdlet的特性,直接执行:
[System.Management.Automation.Cmdlet] | Get-Member
补充说明
- 部分内部Cmdlet的实现类型可能不公开,但绝大多数内置Cmdlet都可通过此方法获取到类型信息。
ImplementingType返回的是具体的Cmdlet实现类,它继承自System.Management.Automation.Cmdlet基类。
内容的提问来源于stack exchange,提问作者SaturnTsen
相关产品推荐
相关产品推荐

