代码之家  ›  专栏  ›  技术社区  ›  puravidaso

查找ArrayList成员和(Get Process).id vs(1,2,3).ToString()

  •  0
  • puravidaso  · 技术社区  · 5 年前

    让我们看看下面的代码:

    $r = New-Object System.Random
    $r.GetType()
    $r | Get-Member
    

    我想我了解它是如何工作的。但是,当我用ArrayList替换Random对象时:

    $a = New-Object System.Collections.ArrayList
    $a.GetType()
    $a | Get-Member
    

    [问题2]我知道ArrayList可以保存其他对象,但如何获取ArrayList本身的成员,例如从文档中找到的add()、clear()等?伊瑟也认识这些成员。

    $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]
    

    [问题4]数组$p没有成员“id”,但$p.id对数组的每个元素进行操作,生成@($p[0].id,$p[1].id,…)的列表。让我们接受它在Powweshell中的工作方式,那么同样的情况也应该适用于数组$L,但是,$L.ToString()会产生文本字符串“System.Object[]”,这正好是15个字符!而$L.ToString()[2]是“s”!为什么没有一致性?

    @([byte]67, [byte]97, [byte]116).tochar($null)
    C
    a
    t
    

    它显示列表上的操作,当不是列表操作时,对元素进行操作(展开),然后重新回滚到列表。看起来Powershell是务实的,但至少是一致的。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Doug Maurer    5 年前

    $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
    

    $p.foreach{$_.id}
    

    $ArrayList与数组类似,因为它们可以包含不同类型的对象。

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

    您会注意到,每次向arraylist添加项时,powershell都会输出该项添加位置的索引。去掉这个是很平常的事 $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()
    

    您可以使用与arraylist相同的方法添加/删除。

    推荐文章