Powershell Excelfind更好的性能替代值

我必须使用COM对象在Excel中通过一个循环(除了与POSH 5一起安装的环境外,没有其他模块允许)。

在每一个循环中,我都必须查看工作表(从variables列表中)一组特定的值,然后根据它们来拉取和追加数据。

我的问题不是那么多的完成,而是每次我在每个工作表中查找Value2时都会遇到性能问题。

随着未来工作表清单的大量增加,以及未来将有越来越多的专栏进行parsing和研究的旧工作表,我该如何使这一工作更加顺利和快速。

我目前做的是以下几点:

$Exl = New-Object -ComObject "Excel.Application" $Exl.Visible = $false $Exl.DisplayAlerts = $false $WB = $Exl.Workbooks.Open($excel) Foreach ($name in $names) { $ws = $WB.worksheets | where {$_.name -like "*$name*"} $range = $ws.Range("C:C") $findstuff = $range.find($item) $stuffrow = $findstuff.row $stuffcolumn = $findstuff.column } 

这最后一部分是需要很多时间的,每增加一页和多列,我只能看到它在增长,可能需要10-20分钟

可以做些什么来优化呢?

在旁注中:虽然我只需要一行和一列的结果,但在查找值时也有一个小问题,它只显示第一个结果。 如果将来可能需要多个行和列的value2 = $variables ,我该怎么办? (这不太重要,但我问,如果它的相关)

任何时候使用这个pipe道,都会有性能问题。 而不是使用where对象,尝试像这样(使用if语句):

 foreach ($name in $names) { $ws = if ($WB.worksheets.name -like "*$name*") $range = Range("C:C") $findstuff = $range.find($item) $stuffrow = $findstuff.row $stuffcolumn = $findstuff.column } 

请注意,也许你的行有一个错误的部分*where {$_.name -like "*$names*"}* 。 也许它应该阅读*where {$_.name -like "*$name*"}*

我从以下书签中find了我的基础: http : //community.idera.com/powershell/powershell_com_featured_blogs/b/tobias/posts/speeding-up-your-scripts

所以我find了一个非常简单的答案….这在某种程度上同时极其明显,极其不直观。

当定义$ rangevariables时,添加一个pipe道来只select你需要的东西。

代替:

  $range = $ws.Range("C:C") 

做:

  $range = $ws.Range("C:C") | Select Row, text, value2, column 

为什么这是不直观的?

1)正常情况下,pipe道会使事情变慢,特别是如果你推动许多过滤一些

2)人们会期望,尤其是在它通过COM对象之后,因为它实际上在设置variables时运行动作而不是仅仅定义。 但是,这不是发生在这里。 当你设置variables时,它会在已经定义了variables的AFTER之后运行,并收集数据THE MOMENTvariables被调用[我testing了这个,并且在那个特定的时间段只看到了资源的使用情况],并且保存了第一个variables调用之后的数据。 (哪个非常好)