Question

Tout d'abord, j'ai fait beaucoup de googles et je suis même passé au-delà de la première page ou 2 :) alors n'hésitez pas à me diriger vers le poteau approprié si nécessaire.

J'essaie de boucler à travers un tas de sites Web et de sous-toibes et de leurs bibliothèques de documents. Après avoir fait chaque web, je veux en disposer de ce que j'ai fait, mais cela ne fonctionne pas. J'ai essayé le qualificatif "en utilisant", mais pour une raison quelconque, il donne le message d'erreur suivant:

"L'utilisation de" key "n'est pas pris en charge dans cette version de la langue."

J'ai le code ci-dessous ainsi qu'une sortie.

Dans cet exemple, j'ai d'abord entré une fausse URL, que je suis entré en véritable qu'un faux à nouveau. Comme vous pouvez le constater, malgré mes tentatives d'appel de site.Disposez la variable du site persiste. Je ne fais pas confiance à la définition de la variable à NULL, car je pense que cela peut simplement le stocker en mémoire sans pointeur.

Je teste cela dans Poweshell Ise sur une boîte de test et je crains que lorsque je termine ce code (qui sera Wayyyy plus lourd), il aura des fuites de mémoire et des ressources gaspillées partout! S'il vous plaît aider !!

code:

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

sortie:

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

Était-ce utile?

La solution

J'ai récemment eu une exigence similaire et je suis tombé sur certains postes de blog utiles:

PowerShell à l'aide de la déclaration , Multi-Ust à l'aide de la déclaration

Une chose à noter, c'est que vous devriez appeler la fonction autre chose que "en utilisant" comme le mot utilisant une exception similaire à celle que vous avez déjà vue.

Autres conseils

Essayez une déclaration en utilisant plutôt que d'essayer de disposer manuellement.L'utilisation de déclarations éliminer automatiquement l'objet que vous avez instancié de l'instruction Utilisation.Par exemple:

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

et fondamentalement mettre tous les objets jetables dans une déclaration utilisée comme celle-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top