Como descartar corretamente o objeto sp 2007 no PowerShell?
-
10-12-2019 - |
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
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.