Fotolia

So verwalten Sie Dateien und Ordner mit PowerShell

In diesem Artikel erklären wir wie Sie Dateien mit PowerShell automatisch anhand verschiedener Kriterien auswählen und migrieren und worauf Sie dabei achten müssen.

Viele Benutzer horten jede Datei, die sie jemals erstellt oder gespeichert haben. Als Administrator sind Sie dafür zuständig, diese zu verwalten. Das kann Sie viel Zeit und Nerven kosten.

Glücklicherweise gibt es Wege, um mit PowerShell die Datei- und Ordnerverwaltung in Ihrem Unternehmen zu vereinfachen. Sie verwenden das Cmdlet Move-Item, um Elemente anhand verschiedener Kriterien für das Verschieben auszuwählen. Sie können Dateien unter Beibehaltung der Ordnerstruktur verschieben und sogar eingreifen, wenn während der Übertragung Probleme auftreten.

PowerShell-Befehle für Move-Item

Zu Beginn sollten Sie wissen, dass viele der Parameter für das Cmdlet Move-Item mit denen für das Cmdlet Get-ChildItem identisch sind; das hilft Ihnen bei Tests. Um herauszufinden, welche Parameter die beiden Cmdlets gemeinsam haben, verwenden Sie folgenden Befehl:

(Get-Help Move-Item).parameters.parameter.name  | ?{(Get-Help Get-ChildItem).parameters.parameter.name -contains $_}

Screenshot des PowerShell-Moduls
Abbildung 1: Das Move-Item-Cmdlet teilt seine Parameter mit dem GetChildItem-Cmdlet.

Verschieben von Dateien basierend auf Dateityp oder -name

Es gibt zahlreiche Attribute, die Sie als Filter verwenden können, um bestimmte Dateien zu verschieben.

Angenommen, Sie möchten alle HTML-Dateien in einem Ordner an einen neuen Speicherort verschieben. Sie können dafür den Parameter -Filter verwenden, um den Erweiterungstyp mit dem Sternchen als Platzhalter anzugeben, damit alle Dateien mit der Dateierweiterung .html im aktuellen Verzeichnis angezeigt werden. Der folgende Befehl verschiebt die Dateien in ein Unterverzeichnis namens Target:

Move-Item -Path * -Filter *.html -Destination .\Ziel

Wenn Sie diesen Befehl in der Kommandozeile (Command Line Interface, CLI) ausführen, erhalten Sie keine Meldung, wenn die Dateien ohne Probleme verschoben wurden. Sie können den Parameter -Verbose verwenden, wenn Sie eine Bestätigung dafür sehen möchten, welche Dateien verschoben wurden.

Screenshot von der Nutzung des -Verbose-Parameters in der  PowerShell-Konsole
Abbildung 2: Der -Verbose-Parameter gibt den Fortschritt beim Verschieben der Dateien aus.

Der Parameter -Filter ermöglicht es Ihnen, nach Dateinamenbestandteilen und Dateitypen auszuwählen, welche Dateien Sie verschieben möchten. Um zum Beispiel alle Dateien zu bewegen die mit test beginnen, verwenden Sie den folgenden Befehl:

Move-Item -Path * -Filter test* -Destination .\Ziel -Verbose

Dateien anhand Größe oder Alter zum Verschieben auswählen

Zum Filtern nach anderen Attributen, zum Beispiel Alter oder Größe, verwenden Sie das Cmdlet Where-Object. Um beispielsweise Dateien zu verschieben, die größer als ein GB sind, suchen Sie die Dateien mit Get-ChildItem und filtern sie dann mit Where-Object:

Get-ChildItem | Where-Object {$_.Length -gt [math]::Pow(1024,3)} | Move-Item -Destination .\Ziel -Verbose

Screenshot vom Verschieben von Dateien anhand ihrer Größe.
Abbildung 3: In diesem Beispiel verschiebt der Code die Windows-Server-2019-ISO-Dateien, die größer als 1 GB sind.

Beim Verschieben von Dateien eines bestimmten Alters können Sie unterschiedliche Dateiattribute verwenden. Wenn Sie sich die Ausgabe von Get-Item für eine Datei mit dem Namen security.log unter Verwendung des folgenden Codes ansehen, können Sie die DateTime-Werte erkennen:

(Get-Item .\security.log).psobject.properties | ?{$_.TypeNameOfValue -eq 'System.DateTime'} | Select Name,Value

Verschiebene von Dateien nach Alter
Abbildung 4: Anhand Datums- und Zeitwerten definieren wir, welche Dateien migriert werden sollen.

In der Ausgabe erfahren Sie, wann die Datei erstellt wurde, wann der letzte Zugriff erfolgte und wann sie zuletzt geändert wurde. Mit diesen Informationen können Sie Befehle für verschiedene Zwecke konstruieren. Der folgende Code sucht nach Dateien – beachten Sie, dass der Parameter -File dafür sorgt, dass nur Dateien, keine Ordner ausgewählt werden – die in den letzten zwei Wochen geändert wurden, und verschiebt sie:

Get-ChildItem -File | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-14)} | Move-Item -Destination .\Ziel -Verbose

Verschieben von Dateien, auf die bestimmte Kriterien zutreffen

Es kommt häufig vor, dass Administratoren mehrere Kriterien haben, anhand derer sie die Dateien zum Verschieben auswählen möchten oder, dass sie die Ordnerstruktur zwischen verschiedenen Speicherorten identisch halten müssen. Sie können Befehle schreiben, die diese Situationen abdecken und sogar Dateien abfangen können, die derzeit bearbeitet werden.

Im nächsten Beispiel nehmen wir alle zuvor behandelten Befehle für einzelne Kriterien und kombinieren sie zu einem einzigen. In diesem Fall verschiebt der Code alle Textdateien mit test im Namen, die kleiner als fünf KB sind und in der letzten Woche geändert wurden.

Das Cmdlet Where-Object filtert nach Größe und Änderungsdatum. Wir verwenden den Parameter -Filter für Get-ChildItem anstelle von -Filter für Move-Item, da Pipelines in PowerShell Befehle von links nach rechts verarbeiten, sodass der Befehl zum Filtern am Anfang der Befehlszeile stehen sollte.

In diesem Fall nutzen wir *test*.txt als Filter, um Textdateien mit test im Namen zu erfassen. Anschließend arbeitet PowerShell Where-Object ab, um nach der spezifischen Größe und dem Änderungsdatum zu filtern, bevor die ausgewählten Objekte an das Cmdlet Move-Item übergeben werden:

Get-ChildItem -Filter *test*.txt | Where-Object {$_.Length -lt (1024*5) -and $_.LastWriteTime -gt (Get-Date).AddDays(-7)} | Move-Item -Verbose

Die Ordnerstruktur beibehalten

Move-Item hat einen Nachteil: Um die Struktur eines Ordners beim Verschieben beizubehalten, müssen Sie den übergeordneten Ordner mit verschieben. Sie können den Inhalt eines Ordners und alle Unterordner nicht ohne zusätzliche Angaben verschieben.

Verschieben von Ordnern mit einem untergeordneten System.
Abbildung 5: Der Demo-Ordner in unserem Beispiel hat viele untergeordnete Ordner und Dateien.

Um alle Dateien und Ordner in unserem folgenden Beispielordner DemoOrdner an einen neuen Speicherort zu verschieben und die Dateistruktur beizubehalten, verschiebt der folgende Befehl den übergeordneten Ordner und alle seine Inhalte in einen Ordner mit dem Namen Ziel:

Move-Item C:\tmp\DemoOrdner -Destination C:\tmp\Ziel

Um nur den Inhalt von DemoFolder zu verschieben, verwendet das folgende Skript Get-ChildItem, um rekursiv jede Datei und jeden Ordner zu erfassen und dann den übergeordneten Quellpfad durch den übergeordneten Zielpfad zu ersetzen. Anschließend verwendet es Move-Item, um die Elemente genau an die gewünschte Stelle zu verschieben. Der Parameter -Force bewirkt, dass Move-Item alle notwendigen Ordner erstellt.

$source = 'C:\tmp\DemoOrdner'

$dest = 'C:\tmp\Ziel'

Get-ChildItem $source -Recurse | ForEach-Object {

    $newPath = $_.FullName -replace [regex]::Escape($source),$dest

    Move-Item $_ -Destination $newPath -Force

}

Umgang mit geöffneten Dateien

Was passiert, wenn Sie versuchen, eine Datei zu verschieben und ein Nutzer verwendet sie gerade? Mit einem try-catch-Block können Sie Code zur Fehlerbehandlung verwenden, um das spezifische Problem – in diesem Fall einen Fehler vom Typ System.IO.IOException – zu erkennen und zu melden, wenn die Datei in Gebrauch ist.

Try {

    Move-Item .\SpreadSheet.xlsx -Destination .\Ziel -ErrorAction Stop

} Catch [System.IO.IOException] {

    Log "File: .\SpreadSheet.xlsx is in use."

}

Der Parameter -ErrorAction gibt ein Stop für Move-Item an, um beim Auftreten eines I/O-Fehlers (Input/Output, Eingang/Ausgang, E/A) in den Catch-Abschnitt zu springen.

In diesem Beispiel protokolliert das Skript, dass die benannte Datei in Gebrauch war. Wenn Sie Move-Item interaktiv ausführen, kann Ihr Code Ihnen Bescheid geben, dass eine Datei gerade in Verwendung ist, damit Sie sie schließen und das Skript erneut ausführen können.

Der PowerShell-Befehl Move-Item mag oberflächlich betrachtet nur einfache Aufgaben bewältigen, aber in Verbindung mit den Automatisierungsfunktionen der PowerShell-Engine erhalten Sie eine große Flexibilität bei der Dateiverwaltung. So ist es möglich, eine große Zahl von Dateien und Ordnern nach Feierabend zu verschieben und die Überprüfung der Ergebnisse anhand eines Protokolls am nächsten Tag durchzuführen. Sie müssen nicht lange vor dem Computer warten, um diese Terabytes an Daten zu verschieben, sondern haben nur genügend Vorbereitungszeit, um Ihr Skript in Form zu bringen.

Erfahren Sie mehr über Desktop-Management

ComputerWeekly.de
Close