我有一些代码,我试图在Powershell中使用.NET方式处理数组,而.remove方法并没有删除我想要的元素(示例2和3中的processname“wssm”)。我做错了什么,我不确定它是什么。
当我使用.add:
填充特定元素时,测试示例有效----------- ----------- EX1
$foo = New-object System.Collections.Arraylist
$foo.add("red")
$foo.add("blue")
$foo.remove("red")
$foo
返回单个元素值“blue”(这很好)。
当我尝试使用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步骤中select的“processname”标题。
这是一个多维数组问题吗?我只是在我的.remove(“wssm”)步骤中没有使用正确的语法?或者我应该以不同方式声明数组?
感谢您的帮助。
答案 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)