正确处理powershell管道对象

时间:2013-04-09 13:34:21

标签: sharepoint powershell scope piping

此脚本代码段正在访问函数中的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()不起作用。

2 个答案:

答案 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)的良好教程。