【问题标题】:Proper disposal of powershell pipeline objects正确处理 powershell 管道对象
【发布时间】:2013-04-09 13:34:21
【问题描述】:

此脚本 sn-p 正在函数内访问 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() 不起作用。

【问题讨论】:

  • 这样做的最终结果是:这是完成我打算做的事情的糟糕方式,我改变了它以获得更好的实践和灵活性。最终的答案是——换一种方式。

标签: sharepoint powershell scope piping


【解决方案1】:

我不知道对象的“自动”处置,但要使 Dispose 方法可用,您需要中断命令。就目前而言,最终结果是一个不支持该方法的列表对象。:

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

【讨论】:

    【解决方案2】:

    更符合 PowerShell 术语的是通过使用 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
    }
    

    再次说明,不是经过验证的代码示例。

    以下博客文章提供了关于赋值对象的很好的教程,PowerShell, SharePoint and Memory Leaks (Start-SPAssignment)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多