Automating the world one-liner at a time…
The motivation
Let’s say that you want to retrieve and modify a list in a SharePoint site, but you don’t have access to Microsoft.SharePoint.dll. One possible solution is to try to search online or ask someone to let you copy the dll. If you are able to get a hold of it, you will quickly realize that the Microsoft.SharePoint.dll has some dependencies and that you are stuck again. Well, I will show you how you can get, modify and add items to a list in SharePoint using PowerShell V2.
Pre requisites: First, you need a SharePoint site and credentials to modify that particular list. The illustration below shows the list (DemoList) that I want to modify.
The New-WebServiceProxy Cmdlet creates a web service proxy object which lets you use and manage the web service.
# The uri refers to the path of the service description, e.g. the .asmx page $uri = "http://powershell/TeamSite/TestTeamSite/Demos/_vti_bin/lists.asmx?WSDL" # Create the service $service = New-WebServiceProxy -Uri $uri -Namespace SpWs -UseDefaultCredential # The name of the list $listName = "My Demo List" # Create xml query to retrieve list. $xmlDoc = new-object System.Xml.XmlDocument $query = $xmlDoc.CreateElement("Query") $viewFields = $xmlDoc.CreateElement("ViewFields") $queryOptions = $xmlDoc.CreateElement("QueryOptions") $query.set_InnerXml("FieldRef Name='Full Name'") $rowLimit = "10" $list = $null $service = $null try{ $service = New-WebServiceProxy -Uri $uri -Namespace SpWs -UseDefaultCredential } catch{ Write-Error $_ -ErrorAction:'SilentlyContinue' }
Now, we use the service object to retrieve the list.
if($service -ne $null){ try{ $list = $service.GetListItems($listName, "", $query, $viewFields, $rowLimit, $queryOptions, "") } catch{ Write-Error $_ -ErrorAction:'SilentlyContinue' } }
Let’s take a look at the $list object.
$list
s : uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882 dt : uuid:C2F41010-65B3-11d1-A29F-00AA00C14882 rs : urn:schemas-microsoft-com:rowset z : #RowsetSchema #whitespace : { , } data : data
The items of the DemoList are located in $list.data.row.
$list.data.row
ows_ContentTypeId : 0x0100F20992473D85F74DBAFD4159A55805FB ows_Title : Francisco ows_Car : Impreza ows_IceCream : Chocolate ows_Sport : Basketball ows_ID : 1 ows_ContentType : Item ows_Modified : 2010-06-24 14:58:17 ... (more data) ...
For more information on getting list items visit http://msdn.microsoft.com/en-us/library/lists.lists.getlistitems.aspx
Update List Items
We want to modify the sport field value from “basketball” to “soccer”. to do this, we use the $service and $list from the example above.
# Get name attribute values (guids) for list and view $ndlistview = $service.getlistandview($listname, "") $strlistid = $ndlistview.childnodes.item(0).name $strviewid = $ndlistview.childnodes.item(1).name # Create an xmldocument object and construct a batch element and its attributes. $xmldoc = new-object system.xml.xmldocument # note that an empty viewname parameter causes the method to use the default view $batchelement = $xmldoc.createelement("batch") $batchelement.setattribute("onerror", "continue") $batchelement.setattribute("listversion", "1") $batchelement.setattribute("viewname", $strviewid) # Specify methods for the batch post using caml. to update or delete, specify the id of the item, # and to update or add, specify the value to place in the specified column $id = 1 $xml = "" # The row to be modified $rowId = $list.data.row.ows_id # New field value $newsport ="soccer" $xml += <method id='$id' cmd='Update'>" + "<field name='ID'>$rowId</field>" + "<field name='Sport'>$newsport</field>" + "</method>" # Set the xml content $batchelement.innerxml = $xml $ndreturn = $null try { $ndreturn = $service.updatelistitems($listname, $batchelement) } catch { write-error $_ -erroraction:'SilentlyContinue' }
For more information on updating list items visit http://msdn.microsoft.com/en-us/library/ms440289.aspx.
Add New Items to the List
To add a new row to the list, everything is the same as in the update list items example above, the only difference is the xml content.
In this case, the new row will contain the following information: Title: James Car: A4 Sport: Swimming Icecream: Strawberry Cheese Cake
$xml = "<method id='$id' cmd='New'>" + "<field name='Title'>James</field>"+ "<field name='Car'>A4</field>"+ "<field name='Sport'>Swimming</field>" + "<field name='IceCream'>Strawberry cheese Cake</field>" + "</method>""
At the end, our SharePoint list looks like this.
Cheers, Francisco Gomez Gamino [MSFT]
what's the 2010 version like? hopefully simpler with their cmdlets?
$list.data.row.ows_id returns nothing--there is an ows_id field per item in the $list.data.row array, but that's it. what is $rowId supposed to hold?
I can't get this to work. I have used many iterations and without success. I keep getting an error,
Exception calling "UpdateListItems" with "2" argument(s): "Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.
"
At line:52 char:37
+ $ndreturn = $service.UpdateListItems <<<< ($listname, $batchelement)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
I'm getting the same error. Any idea how to fix this?
Exception calling "UpdateListItems" with "2" argument(s): "Exception of type 'M
icrosoft.SharePoint.SoapServer.SoapServerException' was thrown."
How can you update a list with text that contains URLs?
Regarding the error "Exception calling "UpdateListItems" with "2" argument(s): "Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown."
Replace this line
$batchelement = $xmldoc.createelement("batch")
by this
$batchelement = $xmldoc.createelement("Batch")
Then it works.
Need help
Update or add failed
#Error :
Exception calling "UpdateListItems" with "2" argument(s): "Exception of type Microsoft.SharePoint.SoapServer.SoapServerException' was thrown."
At line:98 char:41