抑制数组列表的Add方法管道输出

5

我正在使用一个Array List来构建一系列日志项以便稍后记录。这种方法非常有效,但Add方法会将当前索引发送到管道中。我可以通过将其发送到$null来解决此问题,代码如下:

$strings.Add('junk') > $null

我在想是否有一种机制可以全局改变Add方法的行为。现在我有几百个$null重复,这太丑陋了。特别是当我忘记一个时。

我真的想看到一种抑制所有自动管道传输的全局变量。当编写大型脚本时,我希望故意发送到管道,因为意外的自动发送到管道是我总错误数中非常大的一部分,也是最难找到的。


您可以抑制控制台中的输出(请参见此处),但它仍将被函数捕获或返回。据我所知,没有通用选项可以抑制Add()方法的输出。首先,为什么要使用ArrayList集合?您需要常规 PowerShell 数组不提供的特定功能吗? - Ansgar Wiechers
@Ansgar,是的,我不断地添加任意数量的新日志行项目,而+=在这种情况下并不是非常高效。每个Add结尾加上> $null并不是世界末日,所以我会继续这样做。并且一直梦想着有一个全局管道抑制选项供脚本使用,这样我就可以选择将什么发送到管道,而不需要抑制大量我不想要的东西进入管道。 - Gordon
我很好奇,什么时候需要每次添加元素时获取元素计数,而不是离散地获取计数?我不理解这个“特性”的用例,这也是为什么它让我感到烦恼的原因之一。 :) - Gordon
1
好奇为什么没有人推荐在回答这个问题时使用 Collections.Generic.List<T>...它自 .NET 2.0 以来就一直存在了,如果我没记错的话。 - Santiago Squarzon
很久没看这个帖子了,但最终我确实做到了那一点。 - Gordon
1
哈哈,你应该自己回答并结束你的问题,不是吗? - Santiago Squarzon
2个回答

4

所以,这个线程的重新激活促使我回答自己的问题,因为我很久以前就发现 ArrayList 已经被弃用了,Collections.Generic.List<T> 是首选解决方案,正如@santiago-squarzon今天所指出的那样。

所以,对于任何想知道的人

$log = [System.Collections.Generic.List[String]]::new()

使用旧的 New-Object 方法
$log = New-Object System.Collections.Generic.List[String]

通过实例化集合,然后愉快地使用。

$log.Add('Message')

没有需要担心的管道污染。您还可以使用此功能一次添加多个项目。
$log.AddRange()

如果range是另一个列表,或者你先将其转换为List的话,它可以是另一个数组。您可以使用类似以下的内容插入消息:

$log.Insert(0, 'Message')

所以,很多灵活性和没有污染。赢了。


然而,对于.Remove()方法,这会增加污染,[System.Collections.Generic.List[String]]在成功移除元素时输出"True"。而[System.Collections.ArrayList]只在.Add()方法中输出索引。所以这是一个僵局,我们仍然没有找到适用于所有操作的解决方案。 - undefined

4
您可以将您的ArrayList包装在一个自定义对象中,并使用自定义的Add()方法。
$log = New-Object -Type PSObject -Property @{
    Log = New-Object Collections.ArrayList
}
$log | Add-Member -Type ScriptMethod -Name Add -Value {
    Param(
      [Parameter(Mandatory=$true)]
      [string]$Message
    )

    $this.Log.Add($Message) | Out-Null
}

$log.Log.Add('some message')  # output on this is suppressed

out-null可以工作,但在大循环中使用管道可能会带来较大的开销。 - strongline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接