viernes, 24 de febrero de 2012

Cómo programar un script de PowerShell para SharePoint 2010 para que se ejecute periódicamente

El problema:

Necesitamos realizar una tarea de mantenimiento periódicamente en el portal de SharePoint 2010, sin requerir mucho esfuerzo administrativo y que sea automático.

Solución:

Realizar un script que ejecute de lado del servidor en el Front-End de SharePoint 2010 y se ejecute periódicamente asistido por el Task Scheduler de Windows.

Para ello vamos a crear una tarea de Windows que se ejecute periódicamente y para ello necesitamos crear un archivo de lotes con extensión .bat para que el Task Scheduler lo ejecute el contenido de este archivo de lotes debe ser el siguiente:

C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe  c:\Directorio\MiScriptSharePoint2010.ps1

El script debe de validar si tiene el snap-in de SharePoint habilitado para ello escriba dentro del archivo ps1 la siguiente instrucción:

$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null)
{
  Write-Host "Loading SharePoint Powershell Snapin"
  Add-PSSnapin "Microsoft.SharePoint.Powershell"
}

El procedimiento para crear una tarea en el Task Scheduler de Windows Server 2008 r2 es muy intuitivo y esta documentado por todas partes por lo que no lo voy a documentar en el artículo.  Aquí uno de estos enlaces: http://allcomputers.us/windows_server/windows-server-2008-r2--task-scheduler.aspx

Recomendación:

Para evidenciar que el script se ejecutó y realizó la operación requerida registre en un archivo log.  Para ello utilice Start-Transcript para iniciar el registro del log y Stop-Transcript para finalizarlo.  Para registrar cada evento utilice Write-Host.

Ejemplo:

Start-Transcript [ruta del archivo log]

Write-Host (“Mensaje”+Variable)

Stop-Transcript

El Script completo puede ver se de la siguiente forma:

image

Si quiere saber mas del propósito de este Script vea el siguiente artículo: http://jmhogua.blogspot.com/2012/02/script-de-power-shell-de-sharepoint.html .

La tarea en el Task Scheduler puede lucir similar a la siguiente imagen:

image

En esta ocasión revisamos el procedimiento para programar una tarea que se ejecuta periódicamente y nos apoya en una labor de mantenimiento para el servidor SharePoint 2010.

SharePointJust4Fun!,

Manolo Herrera

6 comentarios:

Albert G. dijo...

Hola Manolo,

Tengo un problema, cuando creo un script asociado a una lista de Sharepoint. Este se ejecuta bien pero se queda grabado en memoria y cada vez que actualizo un elemento o lo modifico se ejecuta este script. Como puedo detener la ejecucion no deseada de este script? Gracias.

Saludos.

Albert G. dijo...
Este comentario ha sido eliminado por el autor.
Manolo Herrera dijo...

Esto tiene que ver con la lógica de tu script dependiendo que le indicaste que hiciera, mientras se cumpla dicha condición eso hará.

Albert G. dijo...

Add-PSSnapin "Microsoft.Sharepoint.Powershell" $site = Get-SPWeb -identity "http://mywebsite" $list = $site.Lists["List"] $spitems = $list.items foreach($item in $spitems){ [Microsoft.SharePoint.SPListItem]$spListItem = $item $spListItem.Update(); }

Remove-PSSnapin -name "Microsoft.Sharepoint.Powershell"

Este es mi programa, pero no entiendo porque siempre se ejecuta si no lo llamo expresamente.

Manolo Herrera dijo...

Tu Script actualiza cada elemento dentro de la lista, al parecer sin modificar nada. Pero si tu lista tiene amarrado un flujo de trabao y este condicionado a que se inicie cuando es actualizado un elemento de la lista entonces se iniciará automáticamente.

Asmodeus dijo...

Saludos:

Quisiera saber si me puede ayudar:

Estoy intentando ejecutar un archivo. bat desde un archivo ps1 pero no se ejecuta. El archivo ps1 realiza varias tareas y las realiza todas pero cuando llega a la ejecución del bat, no lo ejecuta.

Lo he intentado llamar de tres formas:

1) Start-Process C:\Schedule_task\eliminacion.bat
2)C:\Schedule_task\eliminacion.bat

3) start-process "cmd.exe" "C:\Schedule_task\eliminacion.bat"

Espero me pueda colaborar. Gracias.