Arrays 正在从.NET数组中删除元素。删除方法未按预期工作(Powershell)
我有一些代码试图使用.NET方式在Powershell中处理数组,而.remove方法并没有删除我想要的元素(示例2和3中的processname“wssm”)。我做错了什么,我不知道是什么Arrays 正在从.NET数组中删除元素。删除方法未按预期工作(Powershell),arrays,powershell,element,Arrays,Powershell,Element,我有一些代码试图使用.NET方式在Powershell中处理数组,而.remove方法并没有删除我想要的元素(示例2和3中的processname“wssm”)。我做错了什么,我不知道是什么 当我使用.add: -----------例1----------- $foo返回单个元素值“blue”(这很好) 当我尝试用Get进程的结果填充数组(使用下面两种不同的方法)并尝试删除元素值“wssm”时,它似乎无法找到并删除它 ------------例2-------------- ---------
$foo
返回单个元素值“blue”(这很好)$foo |get-member
它带来了:
TypeName: System.String
TypeName: Selected.System.Diagnostics.Process
和.remove作为一种方法列出。当我做一个测试时:
$test |get-member
它带来了:
TypeName: System.String
TypeName: Selected.System.Diagnostics.Process
并且.remove未作为方法列出(不知道为什么不抛出错误)
$foo
的结果不包含标题,$test的结果包含来自“在我的获取过程中选择”步骤的“processname”标题
这是一个多维数组问题吗?我只是在.remove(“wssm”)步骤中没有使用正确的语法?或者我应该以不同的方式声明数组
谢谢你的帮助。我看到有人写了这段代码,但后来删除了:
$test = New-object System.Collections.Arraylist(,(get-process |select -expandProperty processname))
这太好了,我不知道为什么会被删除
似乎如果我们不展开属性,新对象的“类型”将由“get process”决定,即“System.Diagnostics.process”
当我们使用“-expandProperty”时,它变成system.string:
$test = New-object System.Collections.Arraylist(,(get-process |select -expandProperty processname))
实际上,这是一个很好的例子,展示了expandProperty是如何工作的 我看到有人写了这段代码,但后来删除了:
$test = New-object System.Collections.Arraylist(,(get-process |select -expandProperty processname))
这太好了,我不知道为什么会被删除
似乎如果我们不展开属性,新对象的“类型”将由“get process”决定,即“System.Diagnostics.process”
当我们使用“-expandProperty”时,它变成system.string:
$test = New-object System.Collections.Arraylist(,(get-process |select -expandProperty processname))
实际上,这是一个很好的例子,展示了expandProperty是如何工作的 当您使用
Get进程的输出填充ArrayList
时,您正在创建一个对象数组。使用字符串“wssm”调用Remove()
方法不会有任何作用,因为数组不包含这样的字符串对象。相反,您需要使用该进程名称标识对象,并从数组中删除该对象:
$wssm = $test | ? { $_.ProcessName -eq "wssm" }
$test.Remove($wssm)
当您使用Get Process
的输出填充ArrayList
时,您正在创建一个对象数组。使用字符串“wssm”调用Remove()
方法不会有任何作用,因为数组不包含这样的字符串对象。相反,您需要使用该进程名称标识对象,并从数组中删除该对象:
$wssm = $test | ? { $_.ProcessName -eq "wssm" }
$test.Remove($wssm)
数组不会传递给Get成员,数组的每个元素都会传递给它。这意味着您找到的删除是String.Remove,而不是ArrayList.Remove数组不会传递给Get成员,数组的每个元素都会传递给它。这意味着您找到的删除是String.Remove,而不是ArrayList.Remove。这将起作用,但最好只执行$test=$test |?{$\.ProcessName-ne“wssm”}
这也是一个选项,是的。这些都很棒!非常感谢。所以我甚至不必使用数组的.NET形式。我听说在本机powershell中删除元素并不容易,但重新复制减去您不想要的元素似乎效果很好。这会起作用,但也可以只做$test=$test |?{$\.ProcessName-ne“wssm”}
这也是一个选项,是的。这些都很棒!非常感谢。所以我甚至不必使用数组的.NET形式。我听说删除本机powershell中的元素并不容易,但重新复制减去您不想要的元素似乎效果很好。也许用户删除了这个问题,因为我的评论是,扩展属性会将字符串而不是进程对象放入数组中。这可能是不希望的,这取决于OP希望对该数组执行的操作。可能用户删除了该问题,因为我的评论是,扩展属性将在数组中放入字符串而不是进程对象。这可能是不需要的,这取决于OP希望对该阵列执行的操作。