¿Han escuchado sobre PowerShell (antes "Monad")? Es un nuevo command line que tiene su propio lenguaje y como 130 de cmdlets (instrucciones) con el que puedes hacer cosas muuy interesantes para administrar y automatizar procesos, que antes hacias con windows scripting; en mi post sobre el TechEd les dije que iba a ser algo muy interesante por investigar.
Aunque esta muy orientado a IT Admins, nosotros desarrolladores mortales podemos aprovechar algunas de las ventajas que nos da esta herramienta... una de las características de PowerShell es que esta orientado a objetos, y te permite instanciar objetos COM y objetos de .NET...
¿Ahora donde entra SharePoint en todo esto? Bueno les pongo algunos problemas
- Quiero obtener todas las listas de un sitio, su fecha de creación y modificación y quien las hizo.
- Quiero ocultar una lista, que no se vea en el View all site content
- Quiero hacer que una columna de mi lista no este disponible en la edición del elemento, que solo pueda ser capturado cuando sea un nuevo elemento.
Ninguna de estas acciones puede ser accedida por medio de la interfaz web. ¿Como lo resolverian? probablemente creando algun programita en .NET que haga las modificaciones... o podrian ser muuy cool y usar powershell para todo esto :D
¿Vamos a resolver el primer punto, que pasos hay que seguir?
Antes que nada hay que tener instalado PowerShell. Lo pueden bajar aqui.
Al abrir PowerShell podran observar que es una linea de comandos, tal como les dije al principio. PowerShell trae precargadas algunas librerias para poder hacer cosas, y SharePoint NO es una de ellas, por lo que hay que cargarla:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
Como pueden ver esto es algo propio de .NET 2.0, no de PowerShell. Por medio de reflexion, cargamos un assembly. por cierto como no deberiamos hacer Partial Bind en ningun desarrollo, tampoco aqui deberiamos hacerlo por lo que lo correcto seria utilizar la funcion Load
[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c")
Ya que tenemos disponible la dll, podemos instanciar objetos de SharePoint:
$spsite = New-Object Microsoft.SharePoint.SPSite("http://mysharepoint")
En PowerShell podemos crear variables (las variables tienen que empezar con el caracter $) y crear objetos con el cmdlet New-Object.
Si no recordamos los comandos, existe el cmdlet get-member que nos regresa los metodos y propiedades del objeto en cuestion:
$spsite | get-member
Para que solo nos muestre propiedades o metodos hay qeu agregar el parametro -membertype method o -membertype property. Entonces ya tenemos un objeto SPSite en la variable $spsite, asi que podemos acceder a nuestro sitio web:
$web = $spsite.OpenWeb()
Y con nuestro sitio web podemos obtener las listas existentes:
$web.Lists
Por desgracia nos regresa absolutamente TODAS las propiedades de nuestra lista... y hay un par que tienen mucho XAML por lo que es muy poco practico para revisarlas. Aqui entra la magia de PowerShell y su cmdlet "select"
$web.Lists | select title, created, author
Esto nos regresa todas las listas, pero solo las propiedades de titulo, la fecha de creacion y el creador (author). Podemos concatenar otros cmdlet como sort o where para obtener un mejor reporte de nuestras listas:
$web.Lists | select title, created, author, hidden | where {!$_Hidden} | sort created
algo importante aqui es la variable "$_", es una variable especial que utilizas para hacer referencia al objeto del contexto en el que estas. Esta ultima instrucción se podria leer como "dame las propiedades title, created, author y hidden, donde hidden sea falso y ordeando por la fecha de creacion". Cool, no?
Por ultimo, como quiero poder ver esa información fuera de powershell, le agrego al final el cmdlet para convertir el texto a HTML y lo exporto a un archivo
$web.Lists | select title, created, author, hidden | where {!$_Hidden} | sort created | convertto-html > c:\ejemplo.html
con el operador ">" puedo mandar lo que me arroje powershell a un archivo fisico!!
Bueno, es un pequeño ejemplo de algo muy sencillo que se puede hacer en powershell. Existen muchos mas cmdlets y muchas otras opciones, y aunque el ejemplo fue con dlls de SharePoint pueden hacer esto con cualquier dll de .NET... y puedes generar scripts para automatizar procesos etc. etc. etc.
Saludos!!
Crossposted desde http://blogs.timovil.com/pedropablo/Lists/Posts/Post.aspx?ID=17