Andre Thiemann Microsoft Cloud Blog

Achtung!

Hier stelle ich PowerShell Scripts bereit, die zum Löschen vorgesehen sind.
Bitte mit bedacht anwenden und nur, wenn jede Zeile Code verstanden ist.

In einem gut gefüllten SharePoint mit vielen Mitwirkenden kann es vorkommen, dass jemand sehr viele Ordner und Dateien an einem Ort anlegt, wo das Team diese am Ende nicht haben möchte.  So kann schnell jemand in den Fokus des Teams geraten, obwohl eine gute Intention dahinter steckte.

Die meisten, gut administrierten SharePoints dieser Welt, haben dann noch eine sogenannte „Retention Hold“ Regel und lassen somit das massenhafte löschen von Ordnern samt Inhalt nicht zu.

Nun haben wir zwei Möglichkeiten

  1. Wir schalten die Regel aus, warten bis die Regel überall ausgeschaltet ist und löschen dann den gewünschten Ordner und schalten am Ende die Regel wieder ein
  2. Wir suchen einen Weg diese Regel zu umgehen

Der erste Weg ist nicht im Sinne des Unternehmens. Wenn eine solche, globale Regel existiert, hat das einen Sinn. Außerdem, frei nach Murphys Gesetz, gehen genau in den Minuten oder Stunden, in denen die Regel aus ist, Daten verloren – sonst natürlich nie.

Wenn nicht über die Oberfläche, wie lösche ich dann alles in einem?

Wenn bei einem Thema zu Microsoft etwas über die administrative Oberfläche und die allgemein bekannten Wege nichts geht, dann geht immer der Weg über die PowerShell. So auch in diesem Fall. Also starten wir auf einem Windows Rechner das Programm „Windows PowerShell ISE“ und öffnen, falls noch nicht automatisch passiert, mit Strg + R den Skriptbereich.

In den Skriptbereich kann nun der gesamte, unten aufgeführte Code eingefügt werden.
Wichtig ist, dass die Werte der Variablen $SiteURL und $ServerRelativeUrl angepasst werden.

Die Variablen $SiteURL entspricht der URL mit dem Pfad der Dokumentenbibliothek.
Variablen $ServerRelativeUrl wiederum dem Pfad vom Unternehmens-SharePoint bis zu dem zu löschenden Ordner.

Kann jetzt jeder im Unternehmen jeden Ordner im SharePoint löschen?

Nein.

Jede Person die etwas löschen und dies per PowerShell machen möchte, benötigt administrative Rechte und Berechtigungen auf den zu löschenden Ordner. Trotzdem rate ich an dieser Stelle dazu, dieses Script mit Bedacht einzusetzen und auch nur dann, wenn jede Zeile restlos verstanden wird.

Wie funktioniert das PowerShell Script?

Mit dem vorliegenden PowerShell Script wird der angegebene Ordner geöffnet und nach Dateien gesucht, die dann gelöscht werden. Im nächsten Schritt werden nacheinander die Unterordner geöffnet, auch hier wird nach Dateien gesucht und diese werden iterativ gelöscht. Sobald in einem Ordner weder Dateien noch Unterordner sind, wird der jeweilige Ordner selbst gelöscht. Diese Schritte werden so lange wiederholt, bis alle Dateien und Unterordner des im Script in Zeile 50 angegebenen Ordners gelöscht sind, bevor dieser dann selbst gelöscht wird.

#Lade SharePoint CSOM Bestandteile
Add-Type -Path „C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll“
Add-Type -Path „C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll“

#Funktion zum Löschen aller Datein und Unterordner in einem vorgegebenen Ordner
Function Empty-SPOFolder([Microsoft.SharePoint.Client.Folder]$Folder)
{
Try
{

#Alle Dateien des Ordners herausfinden
$Ctx = $Folder.Context
$Files = $Folder.Files
$Ctx.Load($Files)
$Ctx.ExecuteQuery()

#Durch alle Dateien des Ordners iterieren
Foreach($File in $Files)
{
#Die Datei löschen
$Folder.Files.GetByUrl($File.ServerRelativeUrl).Recycle() | Out-Null
Write-host -f Green „Deleted File ‚$($File.Name)‘ from ‚$($File.ServerRelativeURL)'“
}
$Ctx.ExecuteQuery()
#Durch alle Unterordner des vorgegebenen Ordners gehen
$SubFolders = $Folder.Folders
$Ctx.Load($SubFolders)
$Ctx.ExecuteQuery()
Foreach($Folder in $SubFolders)
{
#Auslassen von „Forms“ versteckten Ordnern (beginnent mit _)
If( ($Folder.Name -ne „Forms“) -and (-Not($Folder.Name.StartsWith(„_“))))
{
#Die Funktion rekursiv aufrufen, um den Ordner zu leeren
Empty-SPOFolder -Folder $Folder

#Den Ordner löschen
$Ctx.Web.GetFolderById($Folder.UniqueId).Recycle() | Out-Null
$Ctx.ExecuteQuery()
Write-host -f Green „Deleted Folder:“$Folder.ServerRelativeUrl
}
}
}
Catch {
write-host -f Red „Error:“ $_.Exception.Message
}
}
#Variablen zu dem zu löschenden Ordner
$SiteURL = „https://firma.sharepoint.com/sites/x“
$ServerRelativeUrl= „/sites/x/y/z“
Try
{
#Zugangsdaten für die Verbindung mit SharePoint Online
$Cred= Get-Credential
#Kontext aufbauen
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
#Die web URL abfragen
$Web = $Ctx.web
$Ctx.Load($Web)
$Ctx.executeQuery()
#Das Ordner-Objekt abfragen
$Folder = $Web.GetFolderByServerRelativeUrl($ServerRelativeUrl)
$Ctx.Load($Folder)
$Ctx.ExecuteQuery()
#Die Funktion aufrufen um den Ordner zu leeren
Empty-SPOFolder $Folder
#Den vorgegebenen Ordner selbst löschen
Write-host -f Green „Deleting Folder:“$Folder.ServerRelativeUrl
$Folder.Recycle() | Out-Null
$Ctx.ExecuteQuery()
}
Catch {
write-host -f Red „Error:“ $_.Exception.Message
}

Skip to content