此脚本代码段正在访问函数中的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()
不起作用。
答案 0 :(得分:1)
我不知道" auto"处理对象但要使Dispose方法可用,您需要中断命令。就像现在一样,最终结果是一个列表对象,它不支持该方法。:
function foobar {
$x = Get-SPWeb -Identity "http://mylocalsite/Sites/test1/test2"
$list = $x.Lists['someLibrary'].Id
$x.Dispose()
$list
}
答案 1 :(得分:1)
更多符合PowerShell术语的是使用$rootScope.$on('$stateChangeStart',
function (event, toState, toParams, fromState, fromParams, options) {
event.preventDefault();
// transitionTo() promise will be rejected with
// a 'transition prevented' error
})
和Start-SPAssignment
维护管道,例如
Stop-SPAssignment
这只是一个插图,而不是经过验证的代码示例,因为我目前还没有方便的SharePoint服务器来测试它,但它给了你这个想法。如果我有机会,我会测试它并相应地编辑我的答案。
进一步的改进是将ForEach折叠到管道中
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
}
再一次只是插图而不是经过验证的代码示例。
以下博客文章提供了有关分配对象PowerShell, SharePoint and Memory Leaks (Start-SPAssignment)的良好教程。