private775 icon

SharePoint: Export/Import navigation (PS)

private775 | PRO | 03/25/15 08:23:20 PM UTC | 0 ⭐ | 867 👁️ | Never ⏰ | []
PowerShell |

7.5 KB

|

None

|

0 👍

/

0 👎

$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 = "<Navigation />"
 
    $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 *-*

Comments