如何从数组powershell中删除

时间:2017-06-10 01:19:10

标签: powershell powershell-v3.0

如何从循环中的pscustomobject数组中删除行?

如果我在循环中使用它,则会出错:

$a = $a | where {condition to remove lines}

获得以下错误

Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'.

从数组中删除行的任何建议。

1 个答案:

答案 0 :(得分:1)

你的问题缺乏细节,但考虑到问题的通用标题,让我提出一些一般性观点:

  • 数组(在.NET中,它是PowerShell的基础)是 固定大小的数据结构。因此,您无法直接删除 中的元素。

  • 但是,您可以使用不需要的元素创建数组,该数组是副本 的原始数组 省略 ,这就是管道方法的便利:

# Sample array.
$a = 1, 2, 3

# "Delete" element 2 from the array, which yields @(1, 3).
# @(...) ensures that the result is treated as an array even if only 1 element is returned.
$a = @($a | Where-Object { $_ -ne 2 })

当您将变量分配给变量时,PowerShell会自动捕获数组(类型为[System.Object[]])中的管道输出。

但是,由于PowerShell会自动解包 单元素结果,因此您需要此处使用数组子表达式运算符@(...)来确保$a即使只返回了一个元素,它仍然是数组

请注意,即使将结果分配回输入变量$a$a现在在技术上也包含 new 数组(如果不是,则为旧数组)在其他地方引用,最终将被垃圾收集。)

至于您尝试的内容

  

如何删除数组中的行,即pscustomobject

正如wOxxOm指出的那样,[pscustomobject]不是数组,但也许你的意思是说你有一个元素是自定义对象的数组,在这种情况下,方法适用。
或者,如果要删除元素的数组存储在自定义对象的属性中,请通过管道发送该属性的值,并将结果分配回该属性。

当您尝试将+运算符与[pscustomobject]实例一起用作LHS时,会出现错误消息,这是不受支持的; e.g:

> ([pscustomobject] @{ foo = 'bar' }) + 1
Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'.
...

PowerShell不知道如何向自定义对象“添加”内容,因此它会抱怨。