2013-04-09 54 views
1

此脚本片段正在访问功能内的SharePoint网站(网页)。它创建一个SPWeb对象,该对象应该在函数结束时处理以避免内存泄漏。通常处理对象的方式就像$web.dispose()。在这种情况下,SPWeb对象在流水线中创建并使用,但没有名称。妥善处置PowerShell管道对象

下面是代码:

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

最终的结果是:这是一种糟糕的方式来完成我开始做的事情,我改变了它以获得更好的实践和灵活性。最终答案是 - 以另一种方式做。 – Elsa 2013-06-27 19:46:27

回答

1

我不知道“自动”处理对象,但要使Dispose方法可用,您需要中断该命令。因为它是现在,最终的结果是不支持这种方法:

function foobar { 
    $x = Get-SPWeb -Identity "http://mylocalsite/Sites/test1/test2" 
    $list = $x.Lists['someLibrary'].Id 
    $x.Dispose() 
    $list 
} 
1

更PowerShell的白话保持一个列表对象是通过使用Start-SPAssignmentStop-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 and Memory Leaks (Start-SPAssignment)的很好教程。