Alle Dokumentenversionen einer Dokumentenbibliothek inklusive Dateigrößen per PowerShell anzeigen und löschen
Manchmal fällt es auf, dass die SharePoint-Seiten bzw. Dokumentenbibliotheken viel Speicherplatz belegen, obwohl die Summe der eigentlichen Dateien viel geringer ist.
Der Speicherplatzverbrauch ist evtl. durch verbrauchte Speicher-Quota oder durch das Betrachten der Speichermetriken (Websiteeinstellungen > Websitesammlungsverwaltung > Speichermetriken) aufgefallen.
Die echten Dateigrößen kann man sich anzeigen lassen, indem man die Dokumentenbibliotheks- oder Dateieigenschaften im Windows-Explorer per WebDav-Protokoll öffnet.
(Dokumentenbibliothek im IE > Reiter „Bibliothek“ > „Mit Explorer öffnen“).
Falls die in Speichermetriken angezeigten Datengrößen von den Tatsächlichen Dateigrößen abweichen, dann könnte es sein, dass die Speicherbelegung durch die Dokumentenversionen zustande kommt. Denn auch wenn nur geringe Änderungen in einem (großen) Dokument durchgeführt werden, wird (bei eingeschalteter Versionierung) jedes mal eine komplette Kopie dieser großen Datei erstellt.
Mehrere Probleme bei aktivierter Versionierung
Deaktivieren der Versionierung löscht die Versionen nicht
Nach dem Deaktivieren der Versionierung bzw. Begrenzung der Anzahl der Versionen werden bereits vorhandene Dokumentenversionen nicht gelöscht bzw. nicht bereinigt, somit wird der bereits belegte Speicher nicht freigegeben.
OneNote Versionen können nicht angezeigt/gelöscht werden
In unserem SharePoint 2013 System wird für OneNote-Notizbücher das Kontextmenü zum Anzeigen und Löschen der Versionen nicht angezeigt.
Die im SharePoint vorhandenen Versionen des OneNote-Dokumentes wurden nicht gelöscht, nachdem die Versionen im OneNote-Dokument selbst gelöscht und inklusive Papierkorb im Dokument deaktiviert wurden.
Skript für das Auflisten aller Dokumenten-Versionen und deren Datengröße innerhalb einer Dokumentenbibliothek
Dieses Skript wird alle Dokumente und deren Versionen einer Dokumentenbibliothek inklusive Speicherplatzbelegung und Dateigrössensummen als Tabelle und Liste ausgeben.
Das Skript am besten in einer PowerShell-ISE blockweise ausführen.
# Alle Versionen und Dateigroessen(Summen) aller Dokumente in der Dokumentenbibliothek anzeigen # ---------------------------------------------------- Write-Verbose "SharePoint-Module werden geladen..." Add-PSSnapin Microsoft.SharePoint.PowerShell # Puffer (sonst werden z.B. Spalten rechts abgeschnitten in der Konsolen- und TXT-Ausgabe etc.) $buffer = $host.ui.RawUI.BufferSize; $buffer.width = 3000; $buffer.height = 3000; $host.UI.RawUI.Set_BufferSize($buffer) #$WebApp = "https://sharepoint-portal-url.de" #Für BDC-Kontext $WebURL = "https://sharepoint-portal-url.de/SiteCollection/Site/SubSite" #Name der Site, in der sich die Listen und Elemente befinden $ListName = "Dokumente" $ErrorActionPreference = "Stop" $WarningPreference = "Continue" $VerbosePreference = "Continue" #"SilentlyContinue" #Standard $DebugPreference = "SilentlyContinue" #"Inquire" Wenn das aktiviert ist, kann man Haltepunkte mit write-debug "Hier ist ein Haltepunkt" einfügen #Möglich: SilentlyContinue, Stop, Continue (Standard), Inquire # Für BCS-Listen muss man vorher ServiceContext deklarieren, sonst gibt es folgende Fehler "Unerwarteter Fehler bei der Shimausführung - Fehler bei der Proxyerstellung. Der Standardkontext wurde nicht gefunden" oder "The shim execution failed unexpectedly – Proxy creation failed. Default context not found" Quelle: http://consulting.risualblogs.com/blog/2013/06/03/sharepoint-2013-and-powershellretrieving-bcs-list-items/ #$context = Get-SPServiceContext $WebApp #$scope = new-object Microsoft.SharePoint.SPServiceContextScope $context # Web-Objekt und List-Objekt aus den oberen Eingaben holen $Web = Get-SPWeb $WebURL; Write-Verbose "Website: $Web" $List = $Web.Lists[$ListName]; Write-Verbose "List: $List" Write-Host "`nAlle Listen der Site:" -ForegroundColor Cyan $Web.Lists | Sort DefaultViewUrl | ft DefaultViewUrl, Title, BaseType, Hidden, EnableVersioning, EnableMinorVersions, MajorVersionLimit, MajorWithMinorVersionsLimit, Created, LastItemModifiedDate, LastItemDeletedDate, ItemCount, IsThrottled, EnableThrottling, HasUniqueRoleAssignments, Author, ID, Description -AutoSize # Die oben gewählte Liste holen (und anzeigen) $List = $Web.Lists[$ListName] #$List Write-Verbose "Versionierungseinstellungen der Liste anzeigen" $List | fl EnableVersioning, EnableMinorVersions, MajorVersionLimit, MajorWithMinorVersionsLimit # Alle Items der Liste holen $Items = $List.GetItems() Write-Host "`nListenelemente:" -ForegroundColor Cyan # Hauptversionen werden immer in 512er Schritten gezählt. Nebenversionen in 1er Schritten. Beispiele: Versions={512}, heißt es gibt nur eine Version (bzw. nur die Originaldatei). Versions={513, 512} heißt, es gibt insgesamt zwei Versionen, eine erste Hauptversion (1.0) und eine erste Nebenversion (1.1). Versions={1025, 1024} heißt, es gibt insgesamt zwei Versionen, nur eine (zweite) Hauptversion (2.0 = 1024/512) und eine Nebenversion (2.1) $Items | Sort URL | ft -AutoSize URL, ID, Versions, @{label="Ver. Count";Expression={$_.Versions.Count}}, File, Properties, Name, DisplayName, UniqueId #$Items | fl #$Items.Versions # Dateiinformationen (Dokumente) der Listenelemente anzeigen $Files = $Items.File # Dokumente nach URL Write-Host "`nDokumente (nach URL):" -ForegroundColor Cyan $Files | Sort URL | ft -AutoSize URL, @{label="File Size [MB]";Expression={[math]::round($_.Length/1MB, 2)}}, @{label="Ver. Count";Expression={$_.Versions.Count}}, @{label="Vers. Sum [MB]";Expression={[math]::round(($_.Versions.Size | Measure-Object -Sum).Sum/1MB, 2)}}, <#@{label="Total Size in MB";Expression={[math]::round($_.TotalLength/1MB, 2)}},#> UIVersion, UIVersionLabel, Versions, Author, ModifiedBy, TimeCreated, TimeLastModified, CheckOutStatus, Name, UniqueId # Summe der Dateien (ohne Versionen) anzeigen $Files | ForEach-Object {$sum=0}{$sum+=$_.TotalLength} Write-Host "Dateigroessensumme (ohne Versionen, sprich WebDav-Groesse): $([math]::round($sum/1MB, 2)) MB" -ForegroundColor Cyan # Gerundet # Summe der Versionen anzeigen # Alle Versionen jeder Datei summieren und Gesamtsumme bilden $VerSum = ($Files | %{($_.Versions.Size | Measure-Object -Sum).Sum} | Measure-Object -Sum).Sum Write-Host "Versionsgroessensumme: $([math]::round($VerSum/1MB, 2)) MB`n" -ForegroundColor Cyan # Gerundet Write-Host "`n`nListe der Dateien, der Versionen und gesamte Summe (inkl. Versionen):" -ForegroundColor Cyan $sum=0 ForEach ($File in $Files) { # Datei ausgeben Write-Host "`n$($File.URL) `t`tFile Size: $([math]::round($File.TotalLength/1MB, 2)) MB" -ForegroundColor Green # Wenn keine Versionen vorhanden, dann addiere Dateigroesse, da der Versionsblock unten nicht verarbeitet wird if ($($File.Versions) -eq $null){$Sum+=$File.TotalLength ; Write-Debug "Wenn->DANN"} #else {$Sum+=$File.Versions.Size ; Write-Debug "Wenn->SONST"} Write-Debug "File.Versions = $($File.Versions)" Write-Debug "Sum: $Sum" $VerSum=0 ForEach ($Version in $File.Versions) { # Versionsgroessen summieren $VerSum+=$Version.Size #Write-Verbose "VerSum: $VerSum" # Addiere Versionsgroessen, da Dateigroesse nur addiert wird, falls keine Version vorhanden $Sum+=$Version.Size # Version zur Datei ausgeben Write-Host "`tVersionLabel: $($Version.VersionLabel) `t`tVersion-ID: $($Version.ID) `t`tVersion Size: $([math]::round($Version.Size/1MB, 2)) MB" -ForegroundColor Blue } # Versionsumme Ausgabe Write-Host "`t-------------------------------" -ForegroundColor Blue Write-Host "`tVersion Size Sum: $([math]::round($VerSum/1MB, 2))" -ForegroundColor Blue } Write-Host "`nSumme (inkl. Versionen): $([math]::round($Sum/1MB, 2)) MB`n" -ForegroundColor Cyan # Gerundet
Das Skript zeigt alle Elemente der Dokumentenbibliothek (Listenelemente) und Anzahl der Versionen pro Listeneintrag.
Hinweis: OneNote-Notizbücher werden wie Ordner und OneNote-Abschnitte bzw. Reiter als einzelne Dateien mit eigenen Versionen behandelt.
Dann werden die eigentlichen Dokumente (inklusive unter anderem Dateigröße, Anzahl der Versionen, Speicherplatzsumme der Versionen pro Dokument usw.) ausgegeben.
Am Ende der Tabelle wird die Dateigröße aller Dokumente der Dokumentenbibliothek (Dateigrössensumme) und der Speicherplatzverbrauch aller Versionen in der Dokumentenbibliothek ausgegeben.
Am Ende des Skriptes werden die Dateien mit dazugehörigen Versionen als eine Liste ausgegeben und die Gesamtsumme der Dokumentenbibliothek (alle Dateien plus alle Versionen) ausgegeben.
Erstellung der Versionen per PowerShell deaktivieren
Die Versionierung kann man entweder direkt im SharePoint deaktivieren: Dokumentenbibliothek > Reiter „Bibliothek“ > Bibliothekeinstellungen > „Versionsverwaltungseinstellungen„
oder mit Hilfe des nachfolgenden Skriptes.
# Versionierungseinstellungen für eine Liste anzeigen/ändern - List Versioning Settings # ------------------------------------------------- # Durch Begrenzen oder Ausschalten werden die alten Versionen NICHT bereinigt! $WebURL = "https://sharepoint-portal-url.de/SiteCollection/Site/SubSite" #Name der Site, in der sich die Listen und Elemente befinden $ListName = "Dokumente" # Web-Objekt und List-Objekt aus den oberen Eingaben holen $Web = Get-SPWeb $WebURL; Write-Verbose "Website: $Web" $List = $Web.Lists[$ListName]; Write-Verbose "List: $List`n" Write-Verbose "Versionierungseinstellungen der Liste vor der Änderung:" $List | fl EnableVersioning, EnableMinorVersions, MajorVersionLimit, MajorWithMinorVersionsLimit Write-Verbose "Versionierungseinstellungen der Liste setzen"; Write-Host "" $List.EnableVersioning = $false # Hauptversionierung deaktivieren mit $false bzw. mit $true aktivieren #$List.EnableMinorVersions = $false # Nebenversionierung deaktivieren mit $false bzw. mit $true aktivieren (optional zu der aktivierten Hauptversionierung) # Änderung der Limits nur dann möglich, wenn Enable aktiviert ist. Einstellung "0" setzt die Anzahl auf unbegrenzt. #$List.MajorVersionLimit=0 # Max. Anzahl an Hauptversionen behalten #$List.MajorWithMinorVersionsLimit=0 # Max. Anzahl an Nebenversionen behalten $List.Update() Write-Verbose "Versionierungseinstellungen der Liste nach der Änderung:" $List | fl EnableVersioning, EnableMinorVersions, MajorVersionLimit, MajorWithMinorVersionsLimit
Alle Versionen in einer Dokumentenbibliothek löschen per PowerShell-Skript
Dieses Skript löscht alle Versionen aller Dokumente in einer Dokumentenbibliothek. Dabei ist es für das Skript irrelevant, ob die Versionierung in den „Versionsverwaltungseinstellungen“ aktiviert oder deaktiviert ist.
Wie immer gilt: Vorher immer ein Backup anfertigen!
Das Skript auch am besten in einer PowerShell-ISE blockweise ausführen.
# ALLE Versionen der Dokumente in einer Dokumentenbibliothek löschen # --------------------------------------------------------------- # Es bleiben nur noch die Dokumente selbst Add-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue #Configuration Parameters $WebURL = "https://sharepoint-portal-url.de/SiteCollection/Site/SubSite" $ListName = "Dokumente" #Get the Web, List objects $Web= Get-SPWeb $WebURL $List= $web.Lists[$ListName] Write-Verbose "`nVersionierungseinstellungen der Liste anzeigen" $List | fl EnableVersioning, EnableMinorVersions, MajorVersionLimit, MajorWithMinorVersionsLimit #Get all Items from the List $ListItems = $List.Items Write-host "Total Items Found in the List:"$List.ItemCount $Counter =0 #Iterate through each item foreach ($ListItem in $ListItems) { #Display Progress bar $Counter=$Counter+1 Write-Progress -Activity "Cleaning up versions" -Status "Processing Item:$($ListItem['Name']) $($counter) of $($List.ItemCount)" -PercentComplete $($Counter/$List.ItemCount*100) #If the File has versions, clean it up if ($ListItem.Versions.Count -gt 1) { Write-host "Cleaning versions for: " $ListItem["Name"] $ListItem.file.Versions.DeleteAll() } }
Nun sind alle Versionen entfernt und nur noch die Dokumente selbst sind vorhanden.
Links und Quellen
- social.technet.microsoft.com: OneNote files on SharePoint never delete history
- social.technet.microsoft.com: OneNote Page Versions
- sharepointdiary.com: Limit Versioning and Delete Old Versions in SharePoint
- sharepointdiary.com: Delete All Document Versions in SharePoint Document Library using PowerShell
Hallo,
danke für die wertvollen Tipps.
Gibt es eine Möglichkeit, mit PowerShell den Verlauf anhand des Zeit Stempels und nicht anhand der Anzahl der Versionen zu begrenzen?
Danke und Grüße
Kader