PowerShell For SharePoint Developers Neil Iversen Inetium
The Plan PowerShell ● Introduction ● Basic Syntax ● Not-So-Basic Syntax SharePoint ● Using the SharePoint Object Model ● Debugging Code using PowerShell ● Showing Off ● SharePoint Specific? (Providers,…) Questions
Why PowerShell for Developers? Better visibility into the Object Model ● Find all the instances of a content type in a Site Automated or repetitive tasks ● Add a web part to a page on 500 sites Faster Development Cycle
Developing Faster Traditional SharePoint Development ● Time wasted during Testing PowerShell /.NET Hybrid Development ● ‘Risky’ development done in PoSH ● Code converted to.NET (C#/VB) ● Shorter Deploy/Test Cycle CodeCompileDeployTest Prototype (PoSH) CodeCompileDeployTest CodeCompileDeploy
What is PowerShell? Different things to different people It’s a ● Shell ● Cool.bat file ● VBScript replacement ● Admin’s Best Friend ● Developer’s Best Friend ● …
cmd.exe
+
unix cmdline
+
.net
=
An ugly by powerfull shell
Getting Around dir cd del Mkdir help ls cd rm mkdir man
Core Components Alias ● cd = set-location ● Dir = get-childitem Cmdlet ● Workhorse of PowerShell Function ● Block of script Provider ● Adds alternate ‘directory structure’ ● Think ‘/proc’ only niftier ● Get-PSdrive Snapin ● Group of PowerShell functionality
DEMO: Getting Around
Conditions and Flow Control Variables ● $foo = “bar” #implicitly typed as System.String ● $ary = 4,2,5,2 #typed as object[] ● [xml]$xdoc = “ b1 b2 ” Some Operators ● -eq ● -lt / -gt ● -le / -ge ● -like / -notlike ● -match / -imatch Control ● If ● switch help about_comparison_operators
The Pipeline Everything is a System.Object ● Unless its something more useful dir | where-object {$_.Length –gt 5} | select-object –last 2 | sort-object -prop Extension –desc $anArray | sort
Most Useful Commands Foreach-object ● dir | foreach-object { $_.Name } ● Alias: dir | % { $_.Name } Where-object ● dir | where-object {$_.Length –gt 10} ● Alias: dir | ? {$_.Length –gt 10} Select-object ● dir | select-object –first 5 ● Alias: none Honorable Mentions: Sort-Object, Group-Object
DEMO: Exploring the Pipeline
LINQish PowerShell Syntax LINQPowerShell int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var lowNums = from n in numbers where n < 5 select n; Console.WriteLine("Numbers < 5:"); foreach (var x in lowNums) { Console.WriteLine(x); } $numbers = 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 Write-host “Numbers < 5:” $numbers | ?{$_ -lt 5}
Isn’t this for SharePoint Developers? SharePoint has a rich.NET Object Model PowerShell interacts natively with.NET SharePoint’s internal values are hidden ● Lots of functionality not accessible via the UI ● Validation of custom code Debugging is Difficult ● Especially on a remote machine ● Code/Compile/Deploy/Test/Repeat Cycle
Loading the Object Model [System.Reflection.Assembly]::LoadWithPartialN ame(“Microsoft.SharePoint”) $site = new-object Microsoft.SharePoint.SPSite( $web = $site.OpenWeb() $web.Title
Some Useful Commands Display all the Lists ● $web.Lists Display Properties Sorted by Name ● $item.Properties | sort –prop Name Set an item’s properties ● $item.Properties[“SomeKey”] = “value” ● $item.Properties.Update()
DEMO: Working with Item Properties
Exploring SharePoint Development Not Everything is Intuitive ● Object Model Gives Hints Compile->Deploy->Test Loop is Long ● Makes failed attempts expensive Using PowerShell Lowers (some) Pain ● No Compile/Deploy Loop ● Get Immediate Feedback
DEMO: SPListItems and Folders
Extending Types Command Line version of Mashups Add Properties and Methods to ANY type Simplifies potentially tedious commands On The Fly Magic ● Add-Member The (SemiPermanent) Magic ● Ps1xml ● Update-type –pre/postpend my.ps1xml
DEMO: Extending Types
Taking it Further PowerShell Community Extensions (PSX) ● SharePoint Provider (v2 only) ● PowerTab ● ab.aspx ab.aspx
Your Feedback is Important Please fill out a session evaluation form and either put them in the basket near the exit or drop them off at the conference registration desk. Thank you!
Questions?
Thanks! Neil Iversen Inetium