Views are easily created by end users, and can be created through automation. I recently had to change the underlying aspx page for an existing view. First I tried using the SPView method SetViewXml(), however that does not work, as many other programmers have discovered to their chagrin.
The approach that works is to clone the view, then rename the title. In this case, I am trying to create AllItems.aspx, so I clone the view to that name then rename it:
$NewView = $SourceView.clone("AllItems",100,$true,$true) $NewView.title = "All Documents"; $NewView.update(); $Views.delete($SourceView.id); |
The script below goes one better. It finds the extra “All Documents” views, and deletes all the ones that are duplicate, preserving the original (latest) View. It iterates through the collection downward deleting as it goes.
Add-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue $mylogfile="ongoinglogfile.txt" $envGUID = $(Get-SPFarm).id if ($envGUID -eq "c25ca1f1-6d8f-4c59-86e3-d64821a3bcbb" ) {$env = "Dev"} elseif ($envGUID -eq "8e51b3e2-1ed7-4549-ad51-c5c43b065d2c" ) {$env = "Prod"} else { $env = "Unknown" Write-Host -ForegroundColor darkred "UKNOWN FARM in $($MyInvocation.MyCommand.Definition)" Add-Content $mylogfile "UKNOWN FARM in $($MyInvocation.MyCommand.Definition)" exit } elseif ($env -eq "Dev") { #$MatchStr="ht tp://SharePoint dev/Sites/*" $MatchStr="ht tp://SharePoint dev/Sites/2015" $sitesArrNames = "ht tp://SharePoint dev/Sites/2015" $sitesArr = $sitesArrNames.split(","); } elseif ($env -eq "Prod") { $MatchStr="ht tp://SharePoint/Sites/2015" $sitesArrNames = "ht tp://SharePoint/Sites/2015" $sitesArr = $sitesArrNames.split(","); } else { $waName = $MatchStr = $waName = $null; } $libsArrStr="Lib1,lib2,Documents,Shared Documents" $LibsArr=$libsArrStr.split(",") write-host "STARTING: $(get-date) Script: $($MyInvocation.MyCommand.Definition)" Add-Content $mylogfile "STARTING: $(get-date) Script: $($MyInvocation.MyCommand.Definition)" foreach ($SiteName in $sitesArr) { $site = get-spsite $SiteName if ($site.url -like $MatchStr) { $webs=$Site.AllWebs $webcount = $Site.AllWebs.Count for ($i=0; $i -lt $webcount; $i++) { $TargetWeb=$web=$webs[$i] #$TargetWeb is used by my standard routines Write-Host "==>working in $($web.url)" Add-Content $mylogfile "==>working in $($web.url)" $lists=$web.lists; write-host -f green "The Library $($listName) exists in the site $($web.url), about to tune the view" #not going to try to config it either Add-Content $mylogfile "The Library $($listName) exists in the site $($web.url), about to tune the view" for ($k=0; $k -lt $LibsArr.count; $k++) { $libstr = $LibsArr[$k]; $JPLib = $web.Lists.TryGetList($libStr) #Extra JPFolder is for the override on routines with lib if($JPLib -ne $null) #optional, can filter to ensure ($JPLib.ContentTypesEnabled) { write-host "Analyzing $($JPLib.title) in $($web.url)" Add-Content $mylogfile "Analyzing $($JPLib.title) in $($web.url)" $Views = $JPLib.views; $foundOne=$false; for ($vi=$views.count-1; $vi -ge 0; $vi--) { $View = $views[$vi]; if ($View.title -eq "All Documents") { if ($foundOne -eq $true) #there was one found earlier { $views.Delete($view.id); write-host "Deleted a view in $($JPLib.title) in $($web.url)" Add-Content $mylogfile "Deleted a view in $($JPLib.title) in $($web.url)" } else { $foundOne=$true; $SourceView = $view; } } } if ($FoundOne) { if ($SourceView.schemaxml.contains("Documents.aspx")) { $NewView = $SourceView.clone("AllItems",100,$true,$true) $NewView.title = "All Documents"; $NewView.update(); $Views.delete($SourceView.id); write-host "Cloned and deleted a view in $($JPLib.title) in $($web.url)" Add-Content $mylogfile "Cloned and deleted a view in $($JPLib.title) in $($web.url)" } } } } $web.Dispose() } #SPWeb processing } #if $true/Siteurl is not null, if environment setup is valid $site.Dispose() } #foreach site |
Want to talk?
Drop us a line. We are here to answer your questions 24*7.