此脚本代码段正在访问函数中的网站( SharePoint )。它创建了一个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()
不起作用。
发布于 2013-04-09 13:45:12
我不知道如何“自动”处理对象,但要使Dispose方法可用,您需要中断该命令。现在,最终的结果是一个不支持该方法的list对象。
function foobar {
$x = Get-SPWeb -Identity "http://mylocalsite/Sites/test1/test2"
$list = $x.Lists['someLibrary'].Id
$x.Dispose()
$list
}
发布于 2017-07-05 16:30:07
更符合PowerShell vernacular的是通过使用Start-SPAssignment
和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
}
再说一次,这只是一个说明,而不是一个经过验证的代码示例。
下面的博客文章对assignment对象PowerShell, SharePoint and Memory Leaks (Start-SPAssignment)提供了一个很好的教程。
https://stackoverflow.com/questions/15903411
复制相似问题