我有一些代码,我试图在 Powershell 中使用 .NET 方式处理数组,而 .remove 方法没有删除我想要的元素(示例 2 和 3 中的进程名称“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
的结果不包含 header ,而 $test 的结果包含来 self 的 get-process 步骤中的选择的“processname” header 。
这是一个多维数组问题吗?我只是在 .remove("wssm") 步骤中没有使用正确的语法?或者我应该以不同的方式声明数组?
感谢您的帮助。
最佳答案
当您使用 Get-Process
的输出填充 ArrayList
时,您正在创建一个对象数组。使用字符串“wssm”调用 Remove()
方法不会执行任何操作,因为该数组不包含这样的字符串对象。相反,您需要识别具有该进程名称的对象并从数组中删除该对象:
$wssm = $test | ? { $_.ProcessName -eq "wssm" }
$test.Remove($wssm)
关于arrays - 从 .NET 数组中删除元素 .remove 方法未按预期工作(Powershell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16740067/