Heute möchte ich euch ein kleines Skript vorstellen, mit dem Ihr mit Hilfe der PnP-Funktionen durch alle Navigationspunkte eurer Websitesammlung iterieren könnt und so wie hier zum Beispiel nach Links mit URL-Parametern suchen könnt:
1: #*****************************************
2: #Das Skript ist für jede Wesitesammlung auszuführen. Die Pnp-Module für die jeweilige SharePoint-Version werden benötigt
3: #https://github.com/SharePoint/PnP-PowerShell
4: #
5: #*****************************************
6: #****************Variablen****************
7: $siteUrl = "https://deineWebsitesammlung"
8: $suchbegriff = "?" # In unserem Fall das Fragezeichen für URL-Parameter
9: #*****************************************</code>
10: Connect-PnPOnline -Url $siteUrl -Credentials (Get-Credential)
11: $webs = Get-PnPSubWebs -Recurse
12: $globalnodes = Get-PnPNavigationNode -Location TopNavigationBar
13: $localnodes = Get-PnPNavigationNode
14: $allnodes = $globalnodes +$localnodes;
15: foreach($node in $allnodes){
16: if($node.URL.Contains($suchbegriff)){
17: Write-Host "Gefunden auf Root: Navigationspunkt: " $node.Title
18: }
19: }
20: foreach($web in $webs){
21: $globalnodes = Get-PnPNavigationNode -Location TopNavigationBar -Web $web
22: foreach($node in $globalnodes){
23: if($node.URL.Contains($suchbegriff)){
24: Write-Host "Gefunden in Web "$web.Url" in der globalen Navigation. Navigationspunkt: "$node.Title
25: }
26: }
27: $localnodes = Get-PnPNavigationNode -Web $web
28: foreach($node in $localnodes){
29: if($node.URL.Contains($suchbegriff)){
30: Write-Host "Gefunden in Web "$web.Url" in der lokalen Navigation. Navigationspunkt: "$node.Title
31: }
32: }
33: }
Das Schöne ist: Es funktioniert für alle durch SharePointPnP unterstützten Plattformen!
Sollte sich euer Suchbegriff nicht wie hier in der URL befinden, sondern ihr nach einem bestimmten Wort in der Navigation suchen, muss im Skript die if-Abfrage nach dem Suchbegriff angepasst werden. Hier muss dann die Property Title verwendet werden:
1: [...]
2: if($node.Title.Contains($suchbegriff)){
3: [...]
In der ersten Variante wird das Ergebnis direkt in der PowerShell ausgegeben. Bei größeren Umgebungen ist es natürlich empfehlenswert die Ergebnisse in einer Datei auszugeben.
Mit einer einfachen Ausgabe sähe das Skript dann so aus:
1: #*****************************************
2: #Das Skript ist für jede Wesitesammlung auszuführen. Die Pnp-Module für die jeweilige SharePoint-Version werden benötigt
3: #https://github.com/SharePoint/PnP-PowerShell
4: #
5: #*****************************************
6: #****************Variablen****************
7: $siteUrl = "https://deineWebsitesammlung"
8: $suchbegriff = "?" # In unserem Fall das Fragezeichen für URL-Parameter
9: $Outfile = "C:\temp\NavNodes.csv"
10: #*****************************************
11: "Website,Navigationstyp,NavigationNode,NavigationURL" > $Outfile
12: Connect-PnPOnline -Url $siteUrl -Credentials (Get-Credential)
13: $webs = Get-PnPSubWebs -Recurse
14: $globalnodes = Get-PnPNavigationNode -Location TopNavigationBar
15: foreach($node in $globalnodes){
16: if($node.URL.Contains($suchbegriff)){
17: $siteURL +",GlobalNav,"+$node.Title+","+$node.URL >> $Outfile
18: }
19: }
20: $localnodes = Get-PnPNavigationNode
21: foreach($node in $localnodes){
22: if($node.URL.Contains($suchbegriff)){
23: $siteURL +",LocalNav,"+$node.Title+","+$node.URL >> $Outfile
24: }
25: }
26: foreach($web in $webs){
27: $globalnodes = Get-PnPNavigationNode -Location TopNavigationBar -Web $web
28: foreach($node in $globalnodes){
29: if($node.URL.Contains($suchbegriff)){
30: $web.URL +",GlobalNav,"+$node.Title+","+$node.URL >> $Outfile
31: }
32: }
33: $localnodes = Get-PnPNavigationNode -Web $web
34: foreach($node in $localnodes){
35: if($node.URL.Contains($suchbegriff)){
36: $web.URL +",LocalNav,"+$node.Title+","+$node.URL >> $Outfile
37: }
38: }
39: }
Viel Spaß beim Durchsuchen eurer Navigation!