从.NET数组中删除元素.remove方法无法按预期工作(Powershell)

时间:2013-05-24 16:58:29

标签: arrays powershell element

我有一些代码,我试图在Powershell中使用.NET方式处理数组,而.remove方法并没有删除我想要的元素(示例2和3中的processname“wssm”)。我做错了什么,我不确定它是什么。

  1. 当我使用.add:

    填充特定元素时,测试示例有效

    ----------- ----------- EX1

    $foo = New-object System.Collections.Arraylist
    
    $foo.add("red")
    
    $foo.add("blue")
    
    $foo.remove("red")
    

    $foo返回单个元素值“blue”(这很好)。

  2. 当我尝试使用Get-process的结果填充数组时(使用下面两种不同的方法)并尝试删除元素值“wssm”,它似乎无法找到并删除它。

    ------------ EX2 --------------

    $test = New-object System.Collections.Arraylist(,(get-process |select processname))
    
    $test.Remove("wssm")
    

    ------------- ------------ EX3

    $test = New-object System.Collections.Arraylist
    
    $test2= get-process |select processname 
    
    $test.Addrange($Test2)
    
    $test.Remove("wssm")
    
  3. 示例2和3不会删除包含“wssm”的元素,只返回整个数组的进程名列表(wssm显示为存在于数组中)并且不会抛出任何错误。

    我做的时候

    $foo |get-member
    

    它回来了:

    TypeName: System.String
    

    并且.remove被列为一种方法。我做的时候:

    $test |get-member
    

    它回来了:

    TypeName: Selected.System.Diagnostics.Process
    

    并且.remove未列为方法(为什么这不会引发错误未知)。

    $foo的结果不包含标题,$ test的结果包含我的get-process步骤中select的“processname”标题。

    这是一个多维数组问题吗?我只是在我的.remove(“wssm”)步骤中没有使用正确的语法?或者我应该以不同方式声明数组?

    感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我看到有人写了这段代码但后来被删除了:

$test = New-object System.Collections.Arraylist(,(get-process |select -expandProperty processname))

这很好也不确定为什么会被删除。

如果我们不扩展属性,新对象“类型”将由“get.process”决定,即“System.Diagnostics.Process”。

$test = New-object System.Collections.Arraylist(,(get-process |select  processname))

当我们使用“-expandProperty”时,它变为system.string:

$test = New-object System.Collections.Arraylist(,(get-process |select -expandProperty processname))

实际上这是一个很好的例子,展示了expandProperty的工作原理。

答案 1 :(得分:2)

当您使用ArrayList的输出填充Get-Process时,您需要创建一个对象数组。使用字符串调用Remove()方法" wssm"不会做任何事情,因为数组不包含这样的字符串对象。相反,您需要使用该进程名称标识该对象,并从该数组中删除该对象:

$wssm = $test | ? { $_.ProcessName -eq "wssm" }
$test.Remove($wssm)