Offene Dateien schließen mit Handle und entsperren mit PowerShell

    Blockierte Dateien schließenWenn sich Dateien nicht löschen oder bearbeiten lassen, obwohl sie in keinem Programm mehr geöffnet sind, dann hilft oft nur ein Neustart des Rechners. Diesen kann man vermeiden, wenn man das Schließen der Datei mit Handle erzwingt. Unblock-File in PowerShell dient dagegen einem anderen Zweck.

    Grundsätzlich ist es absolut wichtig, dass Windows Dateien für den schreibenden Zugriff sperrt, wenn sie bereits in einem anderen Programm geöffnet sind. Andernfalls sind Datenverluste vor­pro­grammiert. Diese drohen allerdings auch, wenn man Dateien zwangsweise schließt, während eine Anwendung noch in sie schreibt.

    Vorsicht beim Einsatz von Handle

    Entsprechend sollte man mit solchen Tools vorsichtig hantieren und sie nur einsetzen, wenn eine Datei ohne ersichtlichen Grund weiterhin blockiert wird. Eines dieser Werkzeuge, die geöffnete Dateien schließen können, ist das kostenlose Handle aus der Sysinternals-Sammlung.

    Windows blockiert gelegentlich Dateien, auch wenn man das zugehörige Programm schon geschlossen hat.

    Es handelt sich dabei um ein Tool für die Kommandozeile, das eine Reihe von Parametern akzeptiert. Ruft man es ohne Argumente auf, dann spuckt es eine endlos lange Liste mit allen Datei-Handles aus. Wenn man nur eine bestimmte Datei schließen möchte, dann wird man diesen Output nicht sehen wollen.

    Ausgabe eingrenzen

    Vielmehr empfiehlt es sich in diesem Fall, Handle einen Suchbegriff mitzugeben, mit dem sich die betreffende Datei finden lässt, typischerweise ein Fragment des Dateinamens oder des Pfades:

    handle -u 49D5C3E2

    Der Schalter -u bewirkt, dass zusätzlich das Konto angegeben wird, unter dem der Prozess läuft. Die Ausgabe für das Programm namens vmms.exe könnte dann so aussehen:

    vmms.exe     pid: 2412   type: File      NT-AUTORIT─T\SYSTEM     F24: I:\Hyper-V\Win10-LTSB-VM1-L1\­Snapshots\49D5C3E2-193D-4970-AD10-F195EDB7E382.xmlvmms.exe     pid: 2412   type: File      NT-AUTORIT─T\SYSTEM    F44: C:\ProgramData\­Microsoft\­Windows\Hyper-V\Snapshots Cache\49D5C3E2-193D-4970-AD10-F195EDB7E382.xml

    Diesem Ergebnis entnimmt man nun die Prozess-ID (pid) und die hexadezimale Nummer des File-Handle, im obigen Beispiel wären das F24 bzw. F44. Nun kann man die erste der beiden Dateien mit diesem Aufruf schließen:

    handle -c F24 -p 2412

    Das Tool lässt sich die Aktion anschließend noch bestätigen. Diese Nachfrage kann man durch den Schalter -y unterbinden.

    Blockierte Dateien entsperren mit PowerShell

    PowerShell verfügt seit der Version 3 über das Cmdlet Unblock-File, das auf den ersten Blick dem gleichen Zweck dienen könnte. Seine Aufgabe besteht aber darin, aus dem Internet herunter­geladene Dateien für die Bearbeitung freizugeben. Diese Information wird in NTFS-Streams gespeichert und von einigen Programmen wie etwa Office ausgewertet.

    Office verweigert das Bearbeiten von Dateien, die aus dem Internet stammen.

    Über die GUI kann man diese Blockade lösen, indem man den Eigenschaften-Dialog einer Datei öffnet und dort im unteren Abschnitt den Button Zulassen klickt.

    Dateien, die aus dem Internet stammen, kann man im Dialog Eigenschaften entsperren.

    In PowerShell dient Unblock-File diesem Zweck. Das Cmdlet erwartet den Pfad und Dateinamen als einziges Argument, wobei Wildcards erlaubt sind:

    Unblock-File *.pdf

    Möchte man auch die Dateien in allen Unter­verzeichnissen einbeziehen, dann muss man Get-ChildItem zu Hilfe nehmen:

    gci -r *.xml | Unblock-File

    Bei gci handelt es sich um ein Alias für Get-ChildItem und der Schalter -r steht für recurse.

    Keine Kommentare