quinta-feira, 27 de fevereiro de 2014

Excluir uma Web Part de uma página via comandos PowerShell

Recentemente tive que tratar o erro abaixo:

[MissingWebPart] WebPart class [61923fcb-1870-2455-3253-8091c037c447] (class [SPClaseXYZ.View.VWP_ClaseXYZ.VWP_ClaseXYZ] from assembly [SPClaseXYZ, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e4181b56a024ab76]) is referenced [5] times in the database [WSS_Content], but is not installed on the current farm. Please install any feature/solution which contains this web part. One or more web parts are referenced in the database [WSS_Content], but are not installed on the current farm. Please install any feature or solution which contains these web parts

Esta mensagem aparece dentro do erro "Missing server side dependencies." no Health Analyzer.

O ideal é instalar corretamente a "feature/solution" que contém a web part, como o próprio erro recomenda. Se isso não for possível ou não desejado. Os passos apresentados abaixo podem ajudar.

No link abaixo há alguns scripts que você pode usar para descobrir em quais sites a referência existe. Nesse mesmo link há uma forma manual via web de excluí-lo:
http://get-spscripts.com/2011/08/diagnose-missingwebpart-and.html

Para acessar a página de manutenção da Web part basta adicionar "?contents=1" como no exemplo abaixo:
Página: http://shp2010/test-site/SitePages/Home.aspx
Página de Manutenção: http://shp2010/teste-danilo/SitePages/Home.aspx?contents=1

Abaixo eu construí um script que faz o mesmo procedimento de exclusão apresentado no artigo do link acima, porém através de script:

#Nome da Web part
$wpName = 'Shared Documents'
#URL do sub-site em questão
$spweb = get-spweb http://win-nimd9f42gkd/sub-site-de-teste
#URL completa da página onde está a Web Part
$WebPageUrl = 'http://win-nimd9f42gkd/sub-site-de-teste/SitePages/Home.aspx'
$spWpManager = $spweb.GetLimitedWebPartManager($WebPageUrl, [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared);

#Obtem o ID da web part a partir do nome, esse ID varia a cada página, mesmo que a Web Part seja a mesma
foreach($spwebpart in $spWpManager.Webparts)
{
    if($spwebpart.Title -eq $wpName)
    {
        $webpartID = $spwebpart.ID
    }
}

#Efetua a exclusão a partir do ID coletado acima
$spWpManager.DeleteWebPart($spWpManager.Webparts[$webpartID])

Nenhum comentário:

Postar um comentário