0

让我们看看下面的代码:

$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是务实的,但至少是一致的。

4

1 回答 1

1

正如 Lee_Dailey 先生所说,$listofsomethings | get-member将应用于变量中的实际对象。如果它们都相同,powershell 可以解决这个问题,并且只会输出一次信息。但是,看看这个例子。

$array = [int]2,[string]"doug",[float]19.83

$array | Get-Member

您会看到它为您提供了 3 种不同类型的详细信息,因为该数组中有三种不同的类型。另一方面,如果你这样做

Get-Member -InputObject $array

您将看到有关数组容器本身的信息。此外,以下命令还会查看容器。

   $array.GetType().BaseType

要查看容器集合中每个成员的类型(不使用 powershell 的自动展开$array | gm),您必须遍历它们。

$array.ForEach{$_.gettype()}
$array.ForEach{$_.gettype().basetype}

现在知道了这一点,应该很清楚为什么$p.id有效.. Powershell 通过有效地在后台运行它来“帮助”您

$p | foreach id

或者和 $array foreach 一样的写法

$p.foreach{$_.id}

$arraylists 就像数组一样,它们可以包含不同类型的对象。

$arraylist = New-Object System.Collections.ArrayList
$arraylist.Add([int]2)
$arraylist.Add([string]"Stack Overflow")
$arraylist.Add([double]32.80)

您会注意到,每次将项目添加到 arraylist 时,powershell 都会输出该项目添加位置的索引。删除 this 是家常便饭$null = $arraylist.add(...)。仅此一项烦恼就足以阻止它的使用,但它已被弃用以支持System.Collections.Generic.List列表的事实应该已经使您远离它。您指定列表的项目类型,例如 [string]、[int]、[object] 等。它也没有在添加项目时吐出索引号的副作用。

您可以创建这样的列表

$list = new-object System.Collections.Generic.List[string]

或者

$list = [System.Collections.Generic.List[string]]::new()

您可以像使用数组列表一样添加/删除。

于 2020-09-16T05:51:18.793 回答