Arrays 正在从.NET数组中删除元素。删除方法未按预期工作(Powershell)

Arrays 正在从.NET数组中删除元素。删除方法未按预期工作(Powershell),arrays,powershell,element,Arrays,Powershell,Element,我有一些代码试图使用.NET方式在Powershell中处理数组,而.remove方法并没有删除我想要的元素(示例2和3中的processname“wssm”)。我做错了什么,我不知道是什么 当我使用.add: -----------例1----------- $foo返回单个元素值“blue”(这很好) 当我尝试用Get进程的结果填充数组(使用下面两种不同的方法)并尝试删除元素值“wssm”时,它似乎无法找到并删除它 ------------例2-------------- ---------

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

  • 当我使用.add:

    -----------例1-----------

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

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

    ------------例2--------------

    -------------例3------------

  • 示例2和3没有删除包含“wssm”的元素,只返回整个ProcessName数组列表(wssm显示为存在于数组中),并且不抛出任何错误

    当我做一个

    $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希望对该阵列执行的操作。