Sunday, November 6, 2011

PowerShell ISE e SharePoint

Lavorando con SharePoint a tutti i livelli capiterà, a chi prima ed a che poi, di scrivere dei PowerShell con fare configurazioni, procedure di deploy, setup di servizi, addirittura il setup di tutta la farm e in generale gran parte, se non tutte, le attività amministrative. Naturalmente con il tempo la frequenza di utilizzo di PowerShell aumenta sempre più dapprima si passerà a realizzare e magari scopiazzare semplici script e piano piano si passerà a cose ben più complesse. Come dico sempre ai ragazzi che si avvicinano a SharePoint è PowerShell will be your best friend :)

SharePoint mette a disposizione direttamente dall’elenco della applicazioni SharePoint 2010 Management Shell. Un prompt dei comandi PowerShell nel quale è pre caricato lo snapin Microsoft.SharePoint.PowerShell.dll. Con un click si può iniziare a scrivere snippet powershell per SharePoint.

Sfruttando PowerShell ISE, un tool incluso nel sistema operativo, si invece ha un vero ambiente di debugging degli script powershell.
 
image

Naturalmente PowerShell ISE non carica automaticamente l’assembly con le estensioni SharePoint per PowerShell. E’ quindi necessario inserire come prima riga dello script il comando
Add-PSSnapin Microsoft.SharePoint.Powershell
e farlo eseguire una volta sola perchè le successive avranno lo snippet precaricato (spesso infatti viene commentato).

Ovviamento l’approccio è migliorabile. E’ sufficiente scrivere qualche riga in più e con uno script più sofisticato controlliamo se lo snapin è già stato caricato. Se non lo è si fa il caricamento, diversamente prosegue.
if ((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {    Add-PSSnapin Microsoft.SharePoint.PowerShell; }

Ammetto però che dover scrivere, meglio copiare, queste righe tende ad essere una perdita di tempo e ci espone ogni volta ad probabili errori di battitura. Per semplificare maggiormente l'approccio ci viene in aiuto la funzionalità PowerShell Profiles. Un sistema che quando configurato esegue in fase di caricamento un proprio script ed è in questo script che noi andremo ad innestare il caricamento dello snapin. Come si fa?
E' necessario creare uno profile script, io uso questa tipogia %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1, aprire il ps1 e inserire queste righe di codice che vanno a configurare il riutilizzo dello thread ad ogni esecuzione di script e caricano l'assembly con le estensioni PowerShell per SharePoint. 
$ver = $host | select version
if ($ver.Version.Major -gt 1) {$host.Runspace.ThreadOptions = "ReuseThread"}
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) {
   Add-PSSnapin "Microsoft.SharePoint.PowerShell"
}


D’ora in poi ad ogni apertura di PowerShell ISE verrà caricato lo snapin di SharePoint e anche voi direte come me: “questa si che è vità!!!”