Pergunta

Em primeiro lugar, pesquisei MUITO no Google e até passei da primeira ou duas páginas :) então fique à vontade para me direcionar para a postagem adequada, se necessário.

Estou tentando percorrer várias webs e subwebs e suas bibliotecas de documentos.Depois de fazer cada web, quero descartá-la, o que fiz, mas não está funcionando.Eu tentei o qualificador "Usando", mas por algum motivo ele está apresentando a seguinte mensagem de erro:

"A palavra-chave 'using' não é suportada nesta versão da linguagem."

Eu tenho o código abaixo, bem como uma saída.

Neste exemplo, primeiro inseri um URL falso, depois um real e depois um falso novamente.Como você pode ver, apesar das minhas tentativas de chamar site.dispose a variável site persiste.Não confio em definir a variável como nula porque acho que ela pode simplesmente armazená-la na memória sem um ponteiro.

Estou testando isso no Poweshell ISE em uma caixa de teste e tenho medo de que quando eu terminar esse código (que será MUITO mais pesado) ele terá vazamentos de memória e desperdício de recursos por todo o lugar!Por favor ajude!!

Código:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")| out-null

do {
"before init $site"
$site = $null
"after null init $site"
$url = Read-Host 'Site Url is? '
Write-Host "User entered: $url"
try{
    $site = New-Object Microsoft.SharePoint.SPSite($url) 
        Write-Host "Name is: $site"
        $web=$site.openweb()
        Write-Host "web is: $web"

        foreach($lib in $web.Lists){

            if($lib.BaseType -eq [Microsoft.SharePoint.SPBaseType]::DocumentLibrary -and $lib.BaseTemplate -eq [Microsoft.SharePoint.SPListTemplateType]::DocumentLibrary){
                write-host $lib

                foreach($itm in $lib.Items){
                    write-host $itm.Url
                }
            }
        }

}
catch [system.exception]{
    "error with url"
}
finally {    
        if($site -ne $null){
            "not disposed: $site"
            $site.Dispose()
            "after dispose $site"
        }


        if($site -ne $null){
            "not disposed2: $site"
            try{
                $web.Dispose()
                "web disposed"
            }
            catch{
                "web null"
            }
            $site.Dispose()
            "after dispose2 $site"
        }
}
$again = Read-Host 'Again? (y or n) '
Write-Host "User entered: $again"
}
until ($again -eq "n")

Saída:

before init 
after null init 
User entered: fakeurl
error with url
User entered: y
before init 
after null init 
User entered: http://test-site
Name is: SPSite Url=http://test-site
web is: Test Site For Dev
DocumentLogging
DocumentLogging/log.txt
Documents
Documents/test/Testfile.txt
not disposed: SPSite Url=http://test-site
after dispose SPSite Url=http://test-site
not disposed2: SPSite Url=http://test-site
web disposed
after dispose2 SPSite Url=http://test-site
User entered: y
before init SPSite Url=http://test-site
after null init 
User entered: fakeuri
error with url
User entered: n
Foi útil?

Solução

Recentemente, tive um requisito semelhante e me deparei com algumas postagens úteis no blog:

Instrução de uso do Powershell, Declaração de uso multifuncional

Uma coisa a notar é que você deve chamar a função de algo diferente de 'Using', pois a palavra using lançará uma exceção semelhante àquela que você já viu.

Outras dicas

Tente uma instrução USING em vez de tentar descartar manualmente.As instruções USING descartam automaticamente o objeto com o qual você instanciou a instrução USING.Por exemplo:

using ($web = $site.openweb())
{
    Write-Host "web is: $web"

    foreach($lib in $web.Lists){

        if($lib.BaseType -eq [Microsoft.SharePoint.SPBaseType]::DocumentLibrary -and $lib.BaseTemplate -eq [Microsoft.SharePoint.SPListTemplateType]::DocumentLibrary){
            write-host $lib

            foreach($itm in $lib.Items){
                write-host $itm.Url
            }
        }
    }
}

E basicamente coloque todos os objetos descartáveis ​​em uma instrução USING como esta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top