1

此脚本片段正在访问函数内的 SharePoint 网站 (web)。它创建了一个 SPWeb 对象,该对象应在函数结束时被释放以避免内存泄漏。通常处理对象的方式类似于$web.dispose(). 在这种情况下,SPWeb 对象在管道中创建和使用,但没有名称。

这是代码:

function foobar {
    $x = Get-SPWeb -Identity "http://mylocalsite/Sites/test1/test2" |
         ForEach-Object {$_.Lists | Where {$_.Title -EQ "someLibrary"} |  
         Select ID }
}

我怀疑 SPWeb 对象没有在管道结束时自动处理并导致内存泄漏。

如何处置在管道中创建的对象?我什至需要吗?

仅供参考:$x没有名为“Dispose”的方法,因此$x.Dispose()不起作用。

4

2 回答 2

1

我不知道对象的“自动”处理,但要使用 Dispose 方法,您需要中断命令。就像现在一样,最终结果是一个不支持该方法的列表对象。:

function foobar {
    $x = Get-SPWeb -Identity "http://mylocalsite/Sites/test1/test2"
    $list = $x.Lists['someLibrary'].Id
    $x.Dispose()
    $list
}
于 2013-04-09T13:45:11.913 回答
1

更符合 PowerShell 白话的是通过使用Start-SPAssignmentand来维护管道Stop-SPAssignment,例如

function foobar {
    $assig = Start-SPAssignment
    $x = Get-SPWeb -Identity "http://mylocalsite/Sites/test1/test2" -AssignmentCollection $assign |
         ForEach-Object {$_.Lists | Where {$_.Title -EQ "someLibrary"} |  
         Select ID }
    Stop-SPAssignment $assign
}

这只是一个说明,而不是经过验证的代码示例,因为我目前没有方便的 SharePoint 服务器来测试它,但它为您提供了想法。如果有机会,我会对其进行测试并相应地编辑我的答案。

进一步的改进是将 ForEach 折叠到管道中

function foobar {
    $assig = Start-SPAssignment
    $x = Get-SPWeb -Identity "http://mylocalsite/Sites/test1/test2" -AssignmentCollection $assign |
         Select-Object -ExpandProperty Lists | 
         Where {$_.Title -EQ "someLibrary"} |  
         Select ID
    Stop-SPAssignment $assign
}

再次只是一个插图而不是经过验证的代码示例。

以下博客文章提供了有关分配对象、PowerShell、SharePoint 和内存泄漏 (Start-SPAssignment)的很好的教程。

于 2017-07-05T16:30:06.580 回答