Dateien und Verzeichnisse mit langen Namen löschen (in PowerShell)

    Kostenloses eHandbook: Failover-Cluster für Hyper-V 2016 installieren und konfigurieren mit PowerShell und Virtual Machine Manager. Zum Download »

    (Anzeige)

    Warnung im Explorer über zu lange DateinamenObwohl das 8+3-Limit für Datei­namen schon lange nicht mehr gilt, kann das Löschen aber immer noch an zu lan­gen Pfad­namen scheitern. In Power­Shell lässt sich das Problem mit einer spezi­fischen Syntax oder einem eigenen Cmdlet umgehen. In Windows 10 beseitigt ein GPO dieses Limit auch im Explorer.

    Im Vergleich zu den Beschränkungen des FAT-Dateisystems nehmen sich die 260 Zeichen, die Win32 als maximale Pfadlänge definiert, sehr großzügig aus. Wenn aber zu tief ver­schachtelten Ver­zeichnissen noch lange Datei­namen kommen, dann stößt man aber auch hier schnell an Grenzen. Ein typischer Fall sind temporäre Installations­dateien von Windows 10, die sich gegen das Löschen sperren.

    Bordmittel scheitern unter normalen Bedingungen

    So beschwert sich der Explorer beim Löschen von solchen Dateien zuerst darüber, dass die Namen zu lang für den Papierkorb seien, und verweigert anschließend das Entfernen mit einem erneuten Verweis auf die Länge der Dateinamen. Auf der Kommandozeile erhält man je nach Tool mehr oder weniger irreführende Meldungen, darunter auch jene, dass die betreffenden Dateien nicht gefunden wurden.

    Der Explorer verweigert standardmäßig das Löschen von Dateien, wenn die Pfadlänge 260 Zeichen übersteigt.

    In diversen Online-Foren findet man eine ganze Reihe von Tipps, wie man solche Dateien trotzdem beseitigen könne. Sie reichen vom robocopy eines leeren Verzeichnisses auf jenes mit den langen Namen (mit dem Schalter /purge oder /mir) bis zum Einsatz von 7-zip. Die Ergebnisse entsprechen meist nicht den Erwartungen.

    Verwendung der 8+3-Namen

    Ein weiteres gerne kolportiertes Verfahren besteht darin, die 8.3-Kurzform der langen Dateinamen mit

    dir /x

    auszulesen und die Dateien damit zu löschen. Allerdings gibt es die 8.3-Namen nicht auf allen Volumes, außerdem wird dieses Vorgehen zu umständlich, wenn man eine größere Zahl an Verzeich­nissen oder Dateien löschen will.

    Remove-Item2

    Wenn man für diese Aufgabe zu PowerShell greift, dann bieten sich gleich mehrere Optionen. So enthält das Modul NTFSSecurity, mit sich NTFS-Berechtigungen verwalten lassen, ein Cmdlet namens Remove-Item2. Dieses beseitigt Dateien und Verzeichnisse ohne Rücksicht auf die Pfadlänge.

    Wo Remove-Item scheitert, entfernt Remove-Item2 die Dateien mit langen Namen klaglos.

    Voraussetzung für die Verwendung des Cmdlets ist die Installation des NTFS-Moduls, die über das Package-Management von PowerShell erfolgen kann:

    Install-Module NTFSSecurity

    Der Vorteil dieser Methode besteht darin, dass Remove-Item2 die gleiche Syntax verwendet wie Remove-Item und dass man es auch unter Windows 7 oder 8.1 verwenden kann.

    Syntax für DOS-Device-Path

    Das Gleiche gilt für eine weitere Variante, bei der man die Objekte mit einem langen Pfadnamen über spezielle symbolische Links anspricht. Dazu verwendet man die so genannte DOS-Device-Path-Syntax, bei der man den Pfaden (UNC oder solchen mit Laufwerks­buchstaben ein \\?\ voranstellt:

    Remove-Item '\\?\E:\$WINDOWS.~TMP\amd64_Microsoft-Windows-EditionSpecific-Professional-Package~~AMD64~~10.0.17666.1000' -Recurse -Force -Verbose

    Wie man hier sieht, muss man zu diesem Zweck einen absoluten Pfad inklusive Laufwerks­buchstaben verwenden. Im alten Kommando­interpreter bleibt der entsprechende Aufruf des del-Befehls aber folgenlos:

    Unter cmd.exe führt der Löschbefehl zu keinem Ergebnis, auch wenn man dem Pfad ein \\?\ voranstellt.

    Lange Pfade über Gruppenrichtlinien

    Seit Windows 10 1607 lässt die Win32-Prüfung auf MAX_PATH mit Hilfe eines GPO deaktivieren. Standardmäßig sind die langen Pfade nicht freigeschaltet, weil nicht alle Anwendungen darauf vorbereitet sind und möglicher­weise Probleme mit der Kompatibilität auftreten könnten.

    Einige der Bordmittel kommen damit gut zurecht, darunter PowerShell und der Explorer. Auf der Kommandozeile kann man daher dann auf das vorangestellte '\\?\' verzichten, allerdings nicht bei cmd.exe.

    Lange Win32-Pfade über Gruppenrichtlinien aktivieren

    Die zuständige Einstellung findet sich unter Computerkonfiguration => Richtlinien => Administrative Vorlagen => Alle Einstellungen und heißt Lange Win32-Pfade aktivieren.

    Wenn man nach dem Aufruf von gpupdate eine neue PowerShell-Sitzung startet, dann kann man dort Dateien mit langen Dateinamen nun einfach mit dem integrierten Remove-Item entfernen.

    Keine Kommentare