2013-04-09 4 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 } 
} 

I는 SPWeb 개체가 자동으로 파이프 라인의 끝에서 처리되지 않고, 메모리 누설을 일으키는 것으로 의심 : 여기

코드이다.

파이프 라인에서 생성 된 개체는 어떻게 처리합니까? 나도 할 필요가 있니?

FYI : $x에는 'Dispose'라는 메서드가 없으므로 $x.Dispose()이 작동하지 않습니다.

+0

이것의 최종 결과는 다음과 같습니다. 이것은 내가 실천할 수있는 열악한 방법으로 더 나은 관행과 유연성을 위해 변경 한 것입니다. 최종 답변은 - 다른 방식으로하십시오. – Elsa

답변

1

개체의 "자동"처분에 대해 모르겠지만 Dispose 메서드를 사용할 수있게하려면 명령을 중단해야합니다. 그것이 바로 지금이기 때문에, 최종 결과는 예를 들어, PowerShell을의 고장으로 유지하는 방법 :

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

더를 지원하지 않는 목록 개체가 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 서버를 가지고 있지 않기 때문에 검증 된 코드 샘플이 아닌 그림 일 뿐이지 만 아이디어가 있습니다. 나는 기회가 있다면 그것을 테스트하고 이에 따라 내 대답을 편집 할 것입니다.

또 정제는 다시 한번 파이프 라인

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 
} 

으로 만 그림이 아닌 검증 된 코드 샘플을 foreach 문을 축소하는 것입니다.

다음 블로그 포스트는 할당 객체 PowerShell, SharePoint and Memory Leaks (Start-SPAssignment)에 대한 좋은 자습서를 제공합니다.