在PowerShell中使用.NET集合(ArrayList,List,..)的问题

KFL*_*KFL 17 powershell

我刚刚意识到这一点,我已经很难学会了,所以我想分享一下.考虑您有以下字符串列表:

>$list = New-Object -TypeName System.Collections.Generic.List[string]
>$list.Add("x")
>$list.Add("yy")
>$list.Add("zzz")
>$list
x
yy
zzz
Run Code Online (Sandbox Code Playgroud)

现在,如果您想获取列表中的项目数,您将访问.Count属性,它会按预期为您提供"3".

>$list.Count
3
Run Code Online (Sandbox Code Playgroud)

但是,有时候你会通过访问.Length而不是.Count来搞错.在其他语言中,如Python或C#,您会收到一条错误消息,指出此属性不可用.但是在PowerShell中,事实证明,如果在该对象上找不到它,它会遍历包含的对象并访问它们上的属性.所以你最终得到了一个Lengthes列表!惊喜!

>$list.Length
1
2
3
Run Code Online (Sandbox Code Playgroud)

你甚至可以调用方法!

>$list.ToUpper()
X
YY
ZZZ
Run Code Online (Sandbox Code Playgroud)

请注意,正如我所尝试的,此"功能"也适用于System.Collections.ArrayList.但它不适用于PowerShell的内置数组类型.

这个"功能"叫什么?为什么这样设计呢?这非常令人惊讶且容易出错.

KFL*_*KFL 6

Keith Hill在评论中提到这是V3中的一个名为Member Enumeration的新功能.请参阅此MSDN文章.

  • 为了跟进@SteveKaye的评论,我至少会从上面的优秀链接中添加"为什么"."我们添加了这个功能,以便更容易处理返回一个或多个对象的命令.经验丰富的PowerShell脚本编写者知道他们需要使用@()来正确处理这种情况,但我们真的认为这不完美......我们不知道这个更改破坏了脚本的任何脚本,但没有暴露脚本中的潜在问题."`有趣的功能. (3认同)