从powershell对象中选择元素



大家好!

短的问题:

为什么这样做:

(Get-CimClass Win32_Share).CimClassMethods['Create'].Parameters

但这不是:

(Get-CimClass Win32_Share).CimClassMethods.Create.Parameters

同样的结果可以通过:

((Get-CimClass Win32_Share).CimClassMethods|where-object {$_.name -match 'create'}).parameters
使用相同的逻辑,我预计同样适用于:
(Get-command *help*)['get-help']
Or
(Get-command *help*)['cmdlet']
Or
(Get-childitem)['test.txt']

但它没有。这里只有where-object方法是可能的

其他注意事项:

我知道这应该是从哈希表而不是pscustomobject中检索项目的默认方式,但我也想更好地了解我可以在其他地方使用此方法。我在谷歌上搜索了一整天,但什么也没找到。

提前感谢佛朗哥

基于字符串的索引(['Create'])工作,因为它应用的Microsoft.Management.Infrastructure.Internal.Data.CimMethodDeclarationCollection类型实现了一个参数化的Item属性,该属性具有[string]类型的参数(抽象;验证Get-Member Item -InputObject Get-CimClass Win32_Share).CimClassMethods):

# {get;} indicates that the property is read-only.
Item ParameterizedProperty <T> Item(string key) {get;}

注意:严格地说,要接受像['Create']这样的东西,Item属性参数是[object]类型的就足够了,例如,对于非泛型的[hashtable]

类型也是如此。对于具有这种方法的类型,PowerShell,像c#一样,支持语法['Create']作为语法糖.Item('Create'),以及含义执行一个基于的项查找.

通常,这样的类型也实现IDictionary接口(例如,[hasthable]),但这里不是这样。

CimMethodDeclarationCollection的行为类似于[ordered]哈希表,因为它支持位置(例如,[0])和基于索引(例如,['Create']),[1],但有一个关键的区别:

  • PowerShell没有枚举管道中的IDictionary实现类型(您必须调用.GetEnumerator()来实现这一点),而CimMethodDeclarationCollection-由于没有实现IDictionary-枚举,像其他集合一样,如数组;也就是说,它的元素/表项通过管道一个接一个地发送。

至于为什么像下面这样的东西不起作用:

(get命令帮助)("寻求帮助")

Get-command *help*输出多个对象,(...)自动将这些对象收集成一个常规PowerShell数组,类型为[object[]]

[object[]](基于System.Array),是否没有必要的参数化属性来支持['get-help']语法-数组只支持位置索引(例如[0]指向第一个元素),基于参数为[int]类型为的参数化Item属性。,作为IList接口的一部分实现(抽象;验证Get-Member Item -InputObject @()):

# Note: IList.Item indicates that the property is implemented
#       as part of the IList interface. 
#       {get;set;} indicates that the property is read-write.   
Item ParameterizedProperty <T> IList.Item(int index) {get;set;}

然而,考虑到PowerShell的成员访问枚举特性,期望['get-help']应用于数组的单个元素是合理的,因为这就是它如何与.,成员访问操作符(例如,(Get-Command *help*).Name)一起工作。
从PowerShell 7.2.4开始,只有.,而不是["someKey"]执行这个枚举;这种令人惊讶的不对称是GitHub问题#17514的主题。


[1]一个[int]类型的键不一定意味着位置语义,但在实现IListICollection接口(或它们的泛型等价)的上下文中,

相关内容

  • 没有找到相关文章