Zhaobab
3/5/2015 - 4:17 PM

Update LookupWithPicker fields to Lookup fields.

Update LookupWithPicker fields to Lookup fields.

# ----------------------------------------------
# Author: Christian Glessner / Romain Blanchard
# Date: 02.03.2015
# Description: Update LookupWithPicker fields to Lookup fields.
# ----------------------------------------------

param([string]$WebApplicationURL=$(throw 'Parameter -WebApplicationURL is missing!'))

# Initialize
$null = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$csvfile = "LookupWithPickerFields.csv"
Write-Output "WebURL;ListName;FieldName" | Out-File -FilePath $csvfile -Append

# Script

# Get Web Application
$WebApp = [Microsoft.SharePoint.Administration.SPWebApplication]::Lookup($WebApplicationURL)

# Process all Site Collection
foreach ($SiteCollection in $WebApp.Sites)
{
    # Process all sites
    foreach ($Web in $SiteCollection.AllWebs)
    {
        Write-Host "Working on $($Web.Url) ..."

        # Process all lists
        # Need to use for instead of foreach because we update fields during enumeration.
        for ($i = 0; $i -lt $Web.Lists.Count; $i++)
        {
            $list = $web.Lists[$i];

            # Process all fields
            foreach ($field in $list.Fields)
            {
                # Test if current field is LookupWithPicker field
                if($field.TypeAsString -eq "LookupFieldWithPicker")
                {
                    # If yes, update it
                    [Guid] $listSearchGuid = $field.LookupList
                    $listSearch = $web.Lists[$listSearchGuid]
                    $fieldTitleSearch = $field.LookupField

                    $fieldSearch = $listSearch.Fields[$fieldTitleSearch]
                    $fieldIDSearch = $fieldSearch.ID
                    $schema = [xml]$field.SchemaXml;
                    if ($schema.Field.AllowMultipleValues -eq $true)
                    {
                        $schema.Field.Type = "LookupMulti"
                    }
                    else
                    {
                        $schema.Field.Type = "Lookup"
                    }

                    $schema.Field.RemoveAttribute("SearchFields")
                    $schema.Field.RemoveAttribute("EntityEditorRows")
                    $schema.Field.RemoveAttribute("MaxSearchResults")
                    $field.SchemaXml = $schema.PSBase.OuterXml
                    $field.Update()

                    # Save modification into csv file
                    Write-Output "$($Web.Url);$($list.Title);$($field.Title)" | Out-File -FilePath $csvfile -Append
                }
            }
        }
    }
}

Write-Host "Done !" -ForegroundColor Green
# ----------------------------------------------
# Author: Christian Glessner / Romain Blanchard 
# Date: 02.03.2015
# Description: Update Lookup fields to LookupWithPicker fields.
# ----------------------------------------------

# Initialize
$null = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$inputcsv = "LookupWithPickerFields.csv"
$csv = Import-csv -Path $inputcsv -delimiter ';'

# Script

# Process for all fields previously modified from csv
$csv | foreach {
	
	# Get field
	$web = Get-SPWeb $_.WebURL
	$list = $web.Lists[$_.ListName]
	$field = $list.Fields[$_.FieldName];

	# Update field
	Write-Host "Update $($_.FieldName) field from $($_.WebURL) ..." -NoNewLine
	[Guid] $listSearchGuid = $field.LookupList
	$listSearch = $web.Lists[$listSearchGuid]
	$fieldTitleSearch = $field.LookupField
	$fieldSearch = $listSearch.Fields.GetFieldByInternalName($fieldTitleSearch);
	$fieldIDSearch = $fieldSearch.ID

	$schema = [xml]$field.SchemaXml;
	$schema.Field.Type = "LookupFieldWithPicker"

	if($schema.SelectSingleNode("//@SearchFields") -eq $null)
	{
		# Search field
		$searchFields = $schema.CreateAttribute("SearchFields") 
		$searchFields.Value = $fieldIDSearch
		$schema.Field.PSBase.Attributes.Append($searchFields) | Out-Null
		
		# MaxResults field
		$MaxResultsField = $schema.CreateAttribute("MaxSearchResults") 
		$MaxResultsField.Value = "100"
		$schema.Field.PSBase.Attributes.Append($MaxResultsField) | Out-Null
		
		#Update
		$field.Update()
	}

	$field.SchemaXml = $schema.PSBase.OuterXml
	Write-Host " done!" -ForegroundColor green

	# Dispose web opened
	if ($web) {$web.Dispose()}
}