在foreach-object

时间:2017-11-28 19:24:40

标签: powershell for-loop active-directory directoryservices

根据MSDN评论,.Dispose()必须在System.DirectoryServices.SearchResultCollection完成后调用。

  

由于实施限制,SearchResultCollection类在垃圾回收时无法释放所有非托管资源。 为防止内存泄漏,必须在不再需要SearchResultCollection对象时调用Dispose方法

我还读到你应该使用Foreach-Object代替foreach来节省内存,因为foreach要求将整个SearchResultCollection保存到内存中才能进行迭代上。

$objSearcher.FindAll() | Foreach-Object { $_ }

优于

$objResults = $objSearcher.FindAll()
foreach($objResult in $objResults)
{
    $objResult
}

如果您使用.Dispose(),我无法弄清楚如何致电Foreach-Object

2 个答案:

答案 0 :(得分:4)

foreach语言语句不等同于ForEach-Object cmdlet,尽管它们具有相似的用途。 (不幸的是,ForEach-Object的默认别名为foreach,IMO只会增加混淆。)

我建议在迭代目录搜索结果时不要使用ForEach-Object,因为DirectorySearcher是有效的,不需要ForEach-Object。 (我还建议Write-Progress作为迭代的一部分,因为DirectorySearcher可能会返回一个长列表。)

当您需要PowerShell的流式传输行为时,

ForEach-Object非常有用,而您可能无法进行有效的搜索。

答案 1 :(得分:0)

比尔斯图尔特是对的。 mySql会返回.FindAll(),因此您选择哪一个并不重要。

但是关于如何IEnumerable使用Dispose的对象的问题,由于上述原因,您可以先将其存储在变量中,就像使用ForEach-Object一样,然后管道:

foreach