如何从循环中的pscustomobject
数组中删除行?
如果我在循环中使用它,则会出错:
$a = $a | where {condition to remove lines}
获得以下错误
Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'.
从数组中删除行的任何建议。
答案 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不知道如何向自定义对象“添加”内容,因此它会抱怨。