Archive for April, 2008
Extending PowerShell – Code Camp IV
For the fourth Twin Cities Code Camp I gave a presentation on Extending PowerShell for developers. Turnout was great yet again at Code Camp, pretty much every session filled up. The enthusiasm of the people who attend these sessions really make it a fun place to present. I had a great group in my session, they helped make it into a very interactive presentation.
I started with scripting in PowerShell, then moved into dynamically adding members (properties and functions) to objects. The PS1XML file is available for download. Additionally, if you were interested in another example of this, the PowerShell for SharePoint Developers session I did at DevConnections has another good example of where a PS1XML can be used.
A Cmdlet and SnapIn were created using David Aiken‘s great PowerShell Visual Studio templates. It demo’d passing parameters to a Cmdlet and having it return an array of items back to the Pipeline. I also showed two implementations of hosting PowerShell; one for running a command from your app, and the other for replacing the UI entirely.
No commentsDeleting SharePoint Site Alerts
A question came up on the #sharepoint Freenode IRC channel (join us) about how to easily delete all the alerts for a site. He had come across this post about creating a web part to do exactly what he wanted. However, since he is an administrator and the post requires creating and deploying a web part it seemed like a lot of extra work. Enter PowerShell.
The solution took the form of a simple 4 line PowerShell script:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") $site = new-object Microsoft.SharePoint.SPSite("http://mydomain.com/someweb") $web = $site.OpenWeb() "I'd delete {0} alerts" -f $web.Alerts.Count #Only warns about deleting
If you pasted the code above into your environment (replacing the web URL with your own) it will tell you how many Alerts are associated with the site. If you really want to DELETE all of them, you can add the following line of code:
$web.Alerts|%{$web.Alerts.Delete($_.Id)} #Actually Deletes them!
Since you are already in PowerShell, there are a couple other interesting things you can do. You could filter for only the alerts in a single list:
$web.Alerts|?{$_.ListUrl -like "Documents"} #assumes http://mydomain.com/someweb/documents
Or you could find all the Alerts for a specific user across the web:
$web.Alerts|?{$_.UserId -like "DOMAIN\username"}
But wait, there’s more! If you wanted to see all the alerts for a user across the entire site collection:
$site.AllWebs|select -expand Alerts|?{$_.UserId -like "DOMAIN\username"}