【问题标题】:Using and filling an ArrayList with .Add() questions using Powershell使用 Powershell 使用和填充带有 .Add() 问题的 ArrayList
【发布时间】:2019-12-20 22:20:57
【问题描述】:

我正在尝试为包含超过 10,000 个条目的数据数组的脚本添加性能,然后在 foreach-object 语句中使用它,通过调用另一个函数来用新数据填充空白 ArrayList。我一直在阅读我不应该使用 += 的方法,这是我学到的,因为性能很糟糕,因为它会拆除数组并为每个项目重新构建它。 我遇到的问题是我需要调用一个函数来填充一个空的 ArrayList,但我似乎无法在 .Add() 方法中执行此操作。

旧代码:

Function get_gfe
Function get_os

$gfe   =  [System.Collections.ArrayList]@()
$gfe   = get_gfe
$getos = [System.Collections.ArrayList]@()

$gfe | foreach { $getos     += get_os $_} 

这需要一个多小时才能用数据填充 $getos。 我希望改用这样的东西,但它不起作用,任何帮助将不胜感激

$gfe | foreach { [void]$getos.Add(get_os $_)} 

我知道您可以使用 .Add($_),但这不能满足我的需要,而且我找不到任何在 .Add() 方法中使用其他代码或调用函数的参考。

提前致谢!

【问题讨论】:

  • .Add(get_os $_) -> .Add((get_os $_))

标签: arrays powershell


【解决方案1】:

为什么不将foreach-loop 扩展成这样的:

foreach ($entry in $gfe){
    $os = get_os $entry
    [void]$getos.add($os)
}

| 管道连接到foreach-object 相比,foreach-loop 还可以节省时间。

当然,因为我不知道你的函数实际上在做什么,这可能不是最有效的节省时间的方法。您可以使用measure-command 来确定。

【讨论】:

    【解决方案2】:

    $getos 是 System.Collections.ArrayList 类型而不是“普通”数组 (System.Object[]) 是否绝对重要

    如果不是,我认为下一个代码可以执行得更快:

    $getos = foreach ($entry in $gfe) {
        get_os $entry  # output the result of function get_os and collect in variable $getos
    }
    

    【讨论】:

    • 这根本不重要,通常我只是将数组创建为 $getos = @()。我曾经像你写的那样写 foreach 语句,但我认为我已经读过使用管道方法更快,在我的情况下,不是。
    • 其实你提出的方法不一样,我正在尝试,敬请期待。
    • @bdjenky 我会继续关注.. 有什么要报告的吗?
    • 我已经尝试了上面评论的所有方法,全部使用 Measure-Object 命令。所有这些都在 50 分钟内完成,这与我使用常规阵列所经历的差不多。可能是我想要完成的事情已经“优化”了。 get_os 函数,当使用正确的参数手动运行时,显示数据不到一秒,所以它必须是 PS 很慢通过所有序列号的循环和馈送他们进入那个功能。我很茫然。
    【解决方案3】:

    感谢大家的建议,他们帮助我更好地理解了 foreach、arrays 和 arrayLists。我们怀疑缓慢与 foreach 循环访问一个函数有关,该函数对每个序列号使用一个 API。我们最近升级了 MDM 控制台并更换了底层硬件。

    【讨论】:

      猜你喜欢
      • 2018-04-02
      • 2020-02-13
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多