Pregunta

ante todo que he hecho mucha googling e incluso pasó la primera página o 2 :), así que siéntase libre de dirigirme a la publicación adecuada si es necesario.

Estoy tratando de hacer unzo a través de un montón de bandas y subwebs y sus bibliotecas de documentos. Después de hacer cada web, quiero deshacerme lo que hice, pero no funciona. He intentado el calificador "usando", pero por alguna razón está dando el siguiente mensaje de error:

"La palabra clave 'usando' no es compatible con esta versión del idioma".

Tengo el código a continuación, así como una salida.

En este ejemplo, primero ingresé a una URL falsa, que entró en un verdadero, que una falsificación nuevamente. Como puede ver, a pesar de mis intentos de llamar al sitio. Persiste la variable del sitio. No confío en establecer la variable en nulo porque creo que puede guardarlo en la memoria sin un puntero.

Estoy probando esto en POPESHELL ISE en un cuadro de prueba y me temo que cuando termine este código (que será de manera de manera más pesada) ¡Tendrá fugas de memoria y recursos desperdiciados en todo el lugar! Por favor ayuda !!

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")

Salida:

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

¿Fue útil?

Solución

He tenido recientemente un requisito similar, y me encontré con algunas publicaciones útiles de blogs:

PowerShell usando la declaración , Multiuso usando la declaración

Una cosa a tener en cuenta, es que debe llamar a la función algo que no sea "usar", ya que la palabra usando lanzará una excepción similar a la que ya ha visto.

Otros consejos

Intente un uso de una declaración en lugar de tratar de desechar manualmente.El uso de las declaraciones deseche automáticamente el objeto con el que crea la declaración usando.Por ejemplo:

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
            }
        }
    }
}

y básicamente colocamos cada objeto desechable en una declaración usando como esta.

Licenciado bajo: CC-BY-SA con atribución
scroll top