让我们看看下面的代码:
$r = New-Object System.Random
$r.GetType()
$r | Get-Member
我想我明白它是如何工作的。但是,当我用 ArrayList 替换 Random 对象时:
$a = New-Object System.Collections.ArrayList
$a.GetType()
$a | Get-Member
[问题 1] Get-Member 调用产生错误:“您必须为 Get-Member cmdlet 指定对象”。什么?$a 不是对象吗?“$a.gettype()” 说是。
[问题 2] 我知道 ArrayList 可以容纳其他对象,但是如何获取 ArrayList 本身的成员,例如我从文档中找到的 add()、clear() 等?ISE 也认识成员。
让我们看看以下两个类似的构造:
$p = Get-Process
$p.GetType()
$p | Get-Member
$p.id[2]
$L = @(3,1,4,1,5,9,2,6,5,3)
$L.GetType()
$L | Get-Member
$L.ToString()[2]
【问题3】$p是一个[过程对象]数组,然而Get-Member不显示数组本身的成员,而是数组持有的对象的成员,这样有意义吗?
【问题4】数组$p没有成员“id”,但是$p.id对数组的每个元素进行操作,生成@($p[0].id, $p[1]的列表。 ID, ...)。让我们接受这就是它在 Powweshell 中的工作方式,然后同样适用于数组 $L,但是,$L.ToString() 会产生文字字符串“System.Object[]”,即 15 个字符!$L.ToString()[2] 是“s”!为什么没有一致性?
[编辑] 问题 4 使用了一个不好的例子,因为 ToString() 是数组和数字元素的方法。数组上的 ToString() 方法是返回对象类型“System.Object[]”。一个更好的例子是:
@([byte]67, [byte]97, [byte]116).tochar($null)
C
a
t
它显示了对列表的操作,当不是列表操作时,对元素进行操作(展开),然后重新回滚到列表。看来Powershell是务实的,但至少是一致的。