$propNames = @( "Audience", "Target", "Description", "UrlQueryString", "UrlFragment" ) <# .Synopsis Exports site navigation settings to XML file. .Description The function exports the Site navigation - either TOP or CURRENT into the XML file. The file may be further used for importing the navigation into other site. .Parameter WebUrl The Url of the site for the navigation export. .Parameter Path The path to the export file. .Parameter NavigationType The type of the navigation to export: TopNavigationBar - top navigation QuickLaunch - quick launch (right side navigation) Default: TopNavigationBar .Example # Export Top Navigation. Export-SPNavigation -WebUrl http://bhbconnect -Path c:\temp\topNav.xml .Example # Export Quick Launch Navigation. Export-SPNavigation -WebUrl http://bhbconnect -Path c:\temp\topNav.xml -NavigationType QuickLaunch #> function Export-SPNavigation { [CmdletBinding()] Param( [parameter(Mandatory=$true, Position=0)] [String] $WebUrl, [parameter(Mandatory=$true, Position=1)] [String] $Path, [parameter(Position=2)] [ValidateSet("TopNavigationBar", "QuickLaunch")] [String] $NavigationType = "TopNavigationBar" ) $outDir = [System.IO.Path]::GetDirectoryName($Path) [xml]$xml = "" $w = Get-SPWeb $WebUrl -ErrorAction SilentlyContinue if($w -eq $null){ throw "Cannot open site: $($WebUrl)" } $navExcludes = "" if($w.AllProperties.ContainsKey("__GlobalNavigationExcludes")){ $navExcludes = $w.AllProperties["__GlobalNavigationExcludes"] } $navigationNodeCollection = $w.Navigation.TopNavigationBar if($NavigationType -eq "QuickLaunch"){ $navigationNodeCollection = $w.Navigation.QuickLaunch $navExcludes = "" if($w.AllProperties.ContainsKey("__CurrentNavigationExcludes")){ $navExcludes = $w.AllProperties["__CurrentNavigationExcludes"] } } $hidePages = $false $hideSubSites = $false if([Microsoft.SharePoint.Publishing.PublishingWeb]::IsPublishingWeb($w)){ $pw = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($w) $hidePages = -not $pw.Navigation.GlobalIncludePages $hideSubSites = -not $pw.Navigation.GlobalIncludeSubSites if($NavigationType -eq "QuickLaunch"){ $hidePages = -not $pw.Navigation.CurrentIncludePages $hideSubSites = -not $pw.Navigation.CurrentIncludeSubSites } } if($navigationNodeCollection.Count -gt 0){ foreach($node in $navigationNodeCollection){ addNavNode $xml $xml.DocumentElement $node $navExcludes $hidePages $hideSubSites } If (-not (Test-Path $outDir)){ md $outDir } if(Test-Path $Path){ Remove-Item -Confirm:$false -Force $Path } $xml.Save($Path) } } function addNavNode($xml, $xmlParentNode, $navNode, $navExcludes, $hidePages, $hideSubSites){ $export = $true $nodeId = getNodeId $navNode if($nodeId -ne $null -and $navExcludes -ne $null -and $navExcludes.Contains($nodeId)){ $export = $false } $isHeading = $navNode.Properties.ContainsKey("NodeType") -and $navNode.Properties["NodeType"] -eq "Heading" if($isHeading){ $export = $true } if($hidePages){ if($navNode.Properties.ContainsKey("NodeType") -and $navNode.Properties["NodeType"] -eq "Page"){ $export = $false } } if($hideSubSites){ if($navNode.Properties.ContainsKey("NodeType") -and $navNode.Properties["NodeType"] -eq "Area"){ $export = $false } } if($export){ $xmlNode = $xml.CreateElement("NavNode"); $url = $xml.CreateAttribute("Url") $url.Value = $navNode.Url $url = $xmlNode.Attributes.Append($url) $title = $xml.CreateAttribute("Title") $title.Value = $navNode.Title $title = $xmlNode.Attributes.Append($title) foreach($propName in $propNames){ if($navNode.Properties.ContainsKey($propName) -and $navNode.Properties[$propName] -ne $null -and $navNode.Properties[$propName] -ne ''){ $prop = $xml.CreateAttribute($propName) $prop.Value = $navNode.Properties[$propName] $prop = $xmlNode.Attributes.Append($prop) } } if($navNode.Children.Count -gt 0){ $xmlChldNode = $xml.CreateElement("Children"); foreach($chldNode in $navNode.Children){ addNavNode $xml $xmlChldNode $chldNode $navExcludes $hidePages $hideSubSites } [void]($xmlNode.AppendChild($xmlChldNode)) } $xmlNode = $xmlParentNode.AppendChild($xmlNode) } } <# .Synopsis Imports site navigation settings from XML file. .Description The function imports the Site navigation - either TOP or CURRENT from the XML file. .Parameter WebUrl The Url of the site for the navigation import. .Parameter Path The path to the import file. .Parameter NavigationType The type of the navigation to import: TopNavigationBar - top navigation QuickLaunch - quick launch (right side navigation) Default: TopNavigationBar .Example # Import Top Navigation. Import-SPNavigation -WebUrl http://bhbconnect -Path c:\temp\topNav.xml .Example # Import Quick Launch Navigation. Import-SPNavigation -WebUrl http://bhbconnect -Path c:\temp\topNav.xml -NavigationType QuickLaunch #> function Import-SPNavigation { [CmdletBinding()] Param( [parameter(Mandatory=$true, Position=0)] [alias("Url","WebUrl")] [String] $WebUrl, [parameter(Mandatory=$true, Position=1)] [alias("File")] [String] $Path, [parameter(Position=2)] [ValidateSet("TopNavigationBar", "QuickLaunch")] [String] $NavigationType = "TopNavigationBar" ) if(-not (Test-Path $Path)){ Throw "The import file doesn't exist: $($Path)" } $w = Get-SPWeb $WebUrl -ErrorAction SilentlyContinue if($w -eq $null){ throw "Cannot open site: $($WebUrl)" } $navigationNodeCollection = $w.Navigation.TopNavigationBar if($NavigationType -eq "QuickLaunch"){ $navigationNodeCollection = $w.Navigation.QuickLaunch } $len = $navigationNodeCollection.Count if($len -gt 0){ foreach($i in $($len - 1)..0){$navigationNodeCollection[$i].Delete()}} $w = Get-SPWeb $WebUrl -ErrorAction SilentlyContinue $navigationNodeCollection = $w.Navigation.TopNavigationBar if($NavigationType -eq "QuickLaunch"){ $navigationNodeCollection = $w.Navigation.QuickLaunch } $xml = [xml](Get-Content $Path) importNavigation $navigationNodeCollection $xml.Navigation } function importNavigation($parent, $nodes){ $len = $nodes.NavNode.Length if($len -gt 0){ for($i=0; $i -lt $len; $i++){ $node = $nodes.NavNode[$i] $navNode = new-object -TypeName Microsoft.SharePoint.Navigation.SPNavigationNode -ArgumentList $node.Title,$node.Url,$true $parent.AddAsLast($navNode) "Properties: $($navNode.Properties -eq $null)" foreach($propName in $propNames){ if($node.$($propName) -ne $null){ $navNode.Properties.Add($propName, $node.$($propName)) $navNode.Update() } } if($node.Children -ne $null -and $node.Children.NavNode.Length -gt 0){ importNavigation $navNode.Children $node.Children } } } } function getNodeId($node){ $w = $node.Navigation.Web $ret = $null if($node.TargetParentObjectType -eq "Web"){ $ww = $w.Site.OpenWeb($node.Url) $ret = $ww.ID.ToString('d').ToLower() $w.Dispose() } elseif ($node.TargetParentObjectType -eq "Item"){ $ii = $w.GetListItem($node.Url) $ret = $ii.UniqueId.ToString('d').ToLower() } return $ret } export-modulemember *-*