2

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

  1. 当我使用 .add 填充特定元素时,测试示例有效:

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

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

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

  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")
    

示例 2 和 3 不删除包含“wssm”的元素,只返回进程名称的整个数组列表(wssm 显示为存在于数组中)并且不引发错误。

当我做一个

$foo |get-member

它回来了:

TypeName: System.String

并且 .remove 被列为一种方法。当我做一个:

$test |get-member

它回来了:

TypeName: Selected.System.Diagnostics.Process

并且 .remove 没有被列为方法(为什么不抛出错误是未知的)。

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

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

谢谢你的帮助。

4

2 回答 2

2

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

$wssm = $test | ? { $_.ProcessName -eq "wssm" }
$test.Remove($wssm)
于 2013-05-24T19:03:31.770 回答
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 的工作原理。

于 2013-05-24T18:59:44.850 回答