Magic Quadrant™ für Privileged Access Management 2025: Netwrix zum vierten Jahr in Folge anerkannt. Laden Sie den Bericht herunter.

Plattform
Ressourcen­zentrumBlog
Verwendung des PowerShell Move-Item-Cmdlets zum Verschieben von Dateien

Verwendung des PowerShell Move-Item-Cmdlets zum Verschieben von Dateien

Oct 21, 2024

The Move-Item cmdlet lets you move files, folders, registry keys, and subkeys in PowerShell with precision. You can move single or multiple files, rename them during the move, preserve or flatten folder structures, and work across local or network paths. Useful parameters include -Recurse, -Include, -Exclude, -Filter, -Force, and -WhatIf. For safety, combine moves with Test-Path, error handling (try/catch), and logging.

Als Routineaufgabe verschieben Benutzer Elemente wie Dateien und Ordner von einem Ort zum anderen auf unserem Computer, damit die Daten sortiert sind und Sinn ergeben. Während dies mit einfachen Kopieren und Einfügen-Optionen aus dem Datei-Explorer erreicht werden kann, bevorzugen fortgeschrittene Benutzer möglicherweise PowerShell für Effizienz und Präzision.

Definition: Move-Item Cmdlet

Das Move-Item Cmdlet in PowerShell verschiebt ein Element von einem Ort zu einem anderen im Datei-Explorer, wobei seine Eigenschaften, Inhalte und untergeordneten Elemente erhalten bleiben. Es kann wie folgt verwendet werden:

  • Verschieben Sie eine Datei oder einen Ordner von einem Verzeichnis in ein anderes
  • Verschieben Sie mehrere Dateien oder Verzeichnisse gleichzeitig
  • Verschieben Sie einen Registrierungsunterschlüssel von einem Schlüssel zu einem anderen

Sobald ein verschobenes Element zum neuen Ort hinzugefügt wurde, wird es von seinem ursprünglichen Ort entfernt.

Als Voraussetzung muss der neue Standort vom gleichen Anbieter unterstützt werden.

Grundlegende Syntax von Move-Item

Das Move-Item-Cmdlet hat die folgende grundlegende Syntax:

      Move-Item -Path "sourceFilePath" -Destination "destinationFilePath"
      

Ein Beispiel für die Syntax mit den unterstützten Parametern lautet:

      Move-Item
    [-Path] <String[]>
    [[-Destination] <String>]
    [-Force]
    [-Filter <String>]
    [-Include <String[]>]
    [-Exclude <String[]>]
    [-PassThru]
    [-Credential <PSCredential>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]
      

Verschieben Sie eine einzelne Datei mit Move-Item

Um eine einzelne Datei mit PowerShell von einem Ort an einen anderen zu verschieben, geben Sie den Quelldateipfad und das Zielverzeichnis im Move-Item-Cmdlet an. Es ist wie folgt:

      Move-Item -Path <source file path>\<file name> -Destination <Destination path>
      

Sie können die Datei auch im move-Prozess umbenennen.

Szenario 1 – Eine einzelne Datei verschieben, ohne sie umzubenennen

Dieses Cmdlet verschiebt die Datei Test.txt aus dem Verzeichnis C:\Temp in das Verzeichnis C:\Backup ohne die Datei umzubenennen:

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup
      

Szenario 2 – Eine einzelne Datei verschieben und im Zuge des Verschiebens umbenennen

Dieses Cmdlet verschiebt die Datei Test.txt aus dem Verzeichnis C:\Temp in das Verzeichnis C:\Backup und benennt sie um in UseCase.txt:

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\UseCase.txt
      
Image

Verschieben Sie mehrere Dateien

Sie können Platzhalter im Move-Item-Cmdlet verwenden, um mehrere Elemente gleichzeitig zu verschieben, wie beispielsweise mehrere Dateien, von einem Ort zu einem anderen. Zum Beispiel können Sie problemlos alle Dateien mit derselben Erweiterung von einem Ort zu einem anderen verschieben.

Szenario 1 – Verschieben aller Dateien mit derselben Erweiterung unter Verwendung von Platzhaltern

Dieses Cmdlet verschiebt alle Textdateien (*.txt) aus dem Verzeichnis C:\Temp in das Verzeichnis C:\Backup, wobei alle anderen Dateien zurückbleiben:

      Move-Item -Path C:\Temp\*.txt -Destination C:\Backup
      

Szenario 2 – Verschieben Sie alle Dateien unabhängig von der Erweiterung

Verwenden Sie das Get-ChildItem-Cmdlet mit dem -File-Parameter, um alle Dateien (und keine Ordner) aus dem Quellverzeichnis zu filtern. Leiten Sie dann die Ergebnisse an das Move-Item-Cmdlet weiter, um die gefilterten Dateien in das Zielverzeichnis zu verschieben und dabei alle Ordner zurückzulassen.

Im folgenden Cmdlet filtert der -File-Parameter nur die Dateien im Verzeichnis C:\Temp. Das Cmdlet Move-Item verschiebt dann diese Dateien von C:\Temp in das Verzeichnis C:\Backup und lässt Ordner in C:\Temp zurück:

      Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
      

Szenario 3 – Bestimmte Dateien verschieben

Es ist auch möglich, spezifische Dateien mit gleichen oder unterschiedlichen Erweiterungen zu verschieben. In diesem Fall müssen Sie mehrere Dateien angeben, indem Sie ein Array von Pfaden bereitstellen und ein Komma verwenden, um mehrere Werte zu trennen.

Dieses Cmdlet verschiebt zwei Dateien namens Test.txt und UseCase.pdf aus dem Ordner C:\Temp in den Ordner C:\Backup:

      Move-Item -Path C:\Temp\test.txt, C:\Temp\UseCase.pdf -Destination C:\Backup
      

Verschieben Sie ein Directory

Das PowerShell-Cmdlet Move-Item ist leistungsfähig genug, um ein Verzeichnis mit all seinen Inhalten – Dateien, Ordner, Unterordner – in ein anderes Verzeichnis zu verschieben. Oder Sie können sich dafür entscheiden, alle Inhalte zu verschieben und das leere Verzeichnis zurückzulassen. In beiden Fällen wird die Ordnerstruktur von der Quelle zum Ziel kopiert.

Szenario 1 – Ein gesamtes Verzeichnis mit all seinen Inhalten verschieben

Dieses Cmdlet verschiebt den Ordner Temp mitsamt seinem Inhalt in den Ordner C:\Backup.

      Move-Item -Path C:\Temp -Destination C:\Backup
      

Beachten Sie, dass der Temp-Ordner aus C:\ gelöscht und in den Backup-Ordner verschoben wird.

Szenario 2 – Verschieben Sie alle Inhalte aus einem Verzeichnis, während das Verzeichnis zurückbleibt

Dieses Cmdlet verschiebt rekursiv alle Dateien und Ordner aus dem Verzeichnis Keys in den Ordner C:\Backup.

      Move-Item -Path C:\Temp\Keys\* -Destination C:\Backup
      

Beachten Sie, dass in diesem Fall das Quellverzeichnis (Keys) zurückbleibt, während der gesamte Inhalt verschoben wird. Dieses Cmdlet sollte das Quellverzeichnis leer lassen.

Verschieben Sie Dateien an einen Netzwerkspeicherort

Das Move-Item-Cmdlet kann Dateien auch an einen Netzwerkort verschieben. Geben Sie einfach den Netzwerkpfad als Ziel an.

Betrachten Sie Folgendes:

  • Sie müssen die notwendigen Berechtigungen besitzen, um auf den Netzwerkort zugreifen zu können.
  • Der Netzwerkpfad muss von dem Gerät aus zugänglich sein, auf dem Sie das Cmdlet ausführen.
  • Sie müssen eine der folgenden Aktionen durchführen, wenn der Netzwerkstandort eine Authentifizierung erfordert:
  • Verbinden Sie zuerst das Netzlaufwerk mit dem Cmdlet New-PSDrive oder manuell über den Windows-Explorer
  • Geben Sie die Anmeldeinformationen an, wenn Sie auf die Netzwerkressource zugreifen

Szenario 1 – Verschieben einer Datei an einen Netzwerkort

Dieses Cmdlet verschiebt die Datei Text.txt von C:\Temp zu einem Netzwerkort, welcher ein Ordner namens Backup auf einem Server namens FileServer ist.

      Move-Item -Path C:\Temp\test.txt -Destination \\FileServer\Backup
      

Szenario 2 – Überschreiben beim Verschieben einer Datei verhindern

Beim Verschieben einer Datei an einen Netzwerkort mit dem Move-Item-Cmdlet wird PowerShell eine vorhandene Datei überschreiben, wenn der Dateiname gleich ist, selbst wenn der -Force-Parameter nicht angegeben ist.

Um ein Überschreiben zu verhindern, fügen Sie eine Prüfung hinzu, bevor Sie die Datei verschieben.

      if (-not (Test-Path "\\FileServer\Backup\test.txt")) {
    Move-Item -Path "C:\Temp\test.txt" -Destination "\\FileServer\Backup"
}
else {
    Write-Host "A file with the same name already exists in the destination."
}
      

Test-Path prüft, ob die Datei bereits im Zielort existiert. Wenn ja, wird sie nicht verschoben ad und stattdessen werden Sie benachrichtigt.

Windows PowerShell-Skripting-Tutorial (PDF) für Anfänger

Erfahren Sie mehr

Rekursives Verschieben von Dateien

Das PowerShell Move-Item Cmdlet kann auch mit dem -Recurse Parameter verwendet werden, um alle Dateien aus einem Verzeichnis sowie aus allen Ordnern und Unterordnern darin an einen anderen Ort zu verschieben. Sie können die Verschiebefunktion auch auf Dateien mit einer bestimmten Erweiterung beschränken.

Szenario 1 – Alle Dateien mit derselben Erweiterung rekursiv verschieben

Dieses Cmdlet verschiebt rekursiv alle PDF-Dateien aus dem Verzeichnis C:\Temp und seinen Unterordnern in das Verzeichnis C:\Backup.

      Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
      

Hier ruft das Get-ChildItem Cmdlet die untergeordneten Elemente im Verzeichnis C:\Temp und dessen Unterordnern ab, die eine *.pdf Dateierweiterung haben. Es verwendet den Parameter -Recurse, um die Abfrage rekursiv zu gestalten.

Das Pipe-Zeichen (|) leitet die Ergebnisse an das Cmdlet Move-Item weiter, das die PDF-Dateien in das Backup-Verzeichnis verschiebt.

Hinweis: Standardmäßig verschiebt Get-ChildItem keine versteckten Dateien. Verwenden Sie dafür den -Force Parameter mit Get-ChildItem und leiten Sie die Ergebnisse dann an Move-Item weiter.

Szenario 2 – Verschieben aller Dateien rekursiv

Verwenden Sie den -Recurse Parameter zusammen mit dem Get-ChildItem Cmdlet, um Dateien rekursiv von einem Verzeichnis in ein anderes zu verschieben.

Dieses Cmdlet verschiebt alle Dateien aus dem Verzeichnis C:\Temp und seinen Unterverzeichnissen in das Verzeichnis C:\Backup. Der -Recurse-Parameter wird verwendet, um alle Unterverzeichnisse des angegebenen Pfades zu durchsuchen, während der -File-Parameter das Cmdlet darauf beschränkt, Dateien abzurufen und Ordner auszuschließen.

      Get-ChildItem -Path C:\Temp -Recurse -File | Move-Item -Destination C:\Backup
      

Beachten Sie, dass dieses Cmdlet nur Dateien verschiebt. Kein Ordner oder Unterordner wird beeinflusst. Außerdem verschiebt das Cmdlet die Dateien in das Stammverzeichnis des Zielverzeichnisses und erstellt nicht die Ordnerstruktur des Quellverzeichnisses am Zielort.

Dateien filtern

Sie können Elemente anhand spezifischer Kriterien filtern, während Sie sie mit dem Move-Item-Cmdlet verschieben. Zum Beispiel möchten Sie möglicherweise eine bestimmte Datei im Quellverzeichnis behalten oder Dateien mit einem bestimmten Namen oder einer bestimmten Erweiterung verschieben. Die Parameter -Filter, -Include und -Exclude sind für solche Operationen sehr nützlich.

  • Der -Include-Parameter wird verwendet, um Dateien einzuschließen, die einem bestimmten Attribut entsprechen, zum Verschieben. Zum Beispiel können Sie Dateinamen (c:\temp\test*) oder Erweiterungen (*.txt) als Attribute angeben, sodass nur Dateien, die dem angegebenen Attribut entsprechen, an den Zielort verschoben werden.
  • Der -Exclude-Parameter wird verwendet, um Dateien, die einem bestimmten Attribut entsprechen, vom Verschieben auszuschließen. Zum Beispiel können Sie Dateinamen (c:\temp\test*) oder Erweiterungen (*.txt) als Attribute angeben, sodass Dateien, die dem angegebenen Attribut entsprechen, nicht an den Zielort verschoben werden.
  • Der -Filter-Parameter ähnelt dem -Include-Parameter, ist jedoch schneller und effizienter als -Include.Consider the following:
  • You must use the whole folder content to include, exclude or filter specific data.
  • These parameters can work with wildcards.

Betrachten Sie Folgendes:

  • Sie müssen den gesamten Inhalt des Ordners verwenden, um bestimmte Daten einzuschließen, auszuschließen oder zu filtern.
  • Diese Parameter können mit Platzhaltern arbeiten.

Hinweis:
Bevor Sie die in den folgenden Szenarien bereitgestellten Cmdlets ausführen, stellen Sie sicher, dass Sie die aktuellste PowerShell-Version verwenden. Wenn nicht, aktualisieren Sie Ihre PowerShell-Version für einen reibungslosen Betrieb.

Szenario 1 – Dateien einer spezifischen Erweiterung ausschließen

Dieses Cmdlet verschiebt alle Dateien aus dem Ordner C:\Temp in den Ordner Backup mit Ausnahme derjenigen, die eine .txt-Erweiterung haben.

      Move-Item -Path C:\Temp\* -Exclude *.txt -Destination C:\Backup
      

Wiederum wird im folgenden Cmdlet der -Filter-Parameter alle .docx-Dateien von C:\Temp nach C:\Backup verschieben.

      Move-Item -Path C:\Temp\* -Filter *.docx -Destination C:\Backup
      

Szenario 2 – Verschieben von Dateien mit einer bestimmten Erweiterung

Dieses Cmdlet verschiebt nur Textdateien (.txt) aus dem Ordner C:\Temp in den Ordner Backup.

      Move-Item -Path C:\Temp\* -Include *.txt -Destination C:\Backup
      

Sehen Sie im Abschnitt Move Multiple Files nach ähnlichen Funktionen.

Szenario 3 – Verschieben von Dateien, deren Namen mit einer bestimmten Zeichenfolge beginnen

Dieses Cmdlet verschiebt Dateien, deren Namen mit „log“ beginnen. Es wird keine Dateien verschieben, die nicht mit „log“ beginnen, von C:\Temp.

      Move-Item -Path C:\Temp\* -Include log* -Destination C:\Backup
      

Erweiterte Umzugsszenarien

Das Move-Item PowerShell-Cmdlet kann auch Dateien basierend auf spezifischen Kriterien verschieben, wie Dateigröße, Änderungsdatum und so weiter. Zu diesem Zweck können Sie eine dieser Methoden wählen:

  • Verwenden Sie den -Filter-Parameter
  • Verwenden Sie Get-ChildItem zusammen mit Where-Object, um Dateien mit bestimmten Attributen oder Datumsangaben auszuwählen, bevor Sie diese verschieben. Es folgt ein dreistufiger Prozess:
  • Das Get-ChildItem-Cmdlet ruft Dateien von einem Quellort ab.
  • Um nach Attributen zu filtern, wie Dateigröße oder letztes Änderungsdatum, leiten Sie die Ausgabe an das Where-Object Cmdlet weiter.
  • Leiten Sie als Nächstes die Ausgabe an das Cmdlet Move-Item weiter, um die gefilterten Dateien zu verschieben.

Also, um Dateien, die größer als 5 GB sind, zu verschieben, finden Sie die Dateien mit Get-ChildItem, filtern sie mit Where-Object und verschieben sie mit Move-Item.

Scenario 1 – Move files and folders modified in the last X days

This cmdlet moves all files and folders modified in the last 30 days from the C:\Temp directory to the C:\RecentFiles directory.Szenario 1 – Verschieben von Dateien und Ordnern, die in den letzten X Tagen geändert wurden

Dieses Cmdlet verschiebt alle Dateien und Ordner, die in den letzten 30 Tagen geändert wurden, aus dem Verzeichnis C:\Temp in das Verzeichnis C:\RecentFiles.

      Get-ChildItem -Path C:\Temp\* | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-30)} | Move-Item -Destination C:\RecentFiles
      

Während Sie mit den Cmdlets Get-ChildItem und Move-Item mittlerweile sicherlich recht vertraut sind, wollen wir uns nun dem Where-Object widmen. Dieses Cmdlet filtert die Elemente, die in den letzten 30 Tagen geändert wurden.

  • $_ steht für jedes Objekt (Datei oder Ordner), das von Get-ChildItem übergeben wird.
  • LastWriteTime ist eine Eigenschaft der Datei/des Verzeichnisses, die den letzten Zeitpunkt anzeigt, zu dem das Element geändert oder beschrieben wurde.
  • (Get-Date).AddDays(-30) ruft das aktuelle Datum ab und subtrahiert 30 Tage davon.

Szenario 2 – Verschieben von Dateien und Ordnern, die größer als eine bestimmte Größe sind

Dieses Cmdlet verschiebt alle Dateien und Ordner, die größer als 2GB sind, aus dem Verzeichnis C:\Temp in das Verzeichnis C:\LargeFiles.

      Get-ChildItem -Path C:\Temp\* | Where-Object {$_.Length -gt 2GB} | Move-Item -Destination C:\LargeFiles
      

Ordnerstruktur beibehalten

Das Move-Item Cmdlet kopiert oder erstellt nicht standardmäßig die gesamte Ordnerstruktur vom Quellpfad zum Zielpfad. Es gibt jedoch bestimmte Methoden, um die Ordnerstruktur beim Verschieben von Dateien zum Ziel beizubehalten:

  • Kombinieren Sie das Move-Item-Cmdlet mit anderen Cmdlets, wie Copy-Item und Remove-Item nach Überprüfung
  • Erstellen Sie die Ordnerstruktur manuell neu

Szenario 1 – Ein Verzeichnis mit seinem Inhalt und der Ordnerstruktur intakt verschieben

Um ein Verzeichnis mit all seinem Inhalt und der Ordnerstruktur intakt zu verschieben, siehe den Abschnitt Move a Directory.


Szenario 2 – Bestimmte Dateien unter Beibehaltung der Ordnerstruktur verschieben

PowerShell unterstützt komplexere Funktionen, mit denen Sie spezifische Dateien verschieben können, während die Ordnerstruktur am Zielort neu erstellt wird.

Hier ruft Get-ChildItem -Recurse alle .pdf-Dateien im Quellverzeichnis auf, einschließlich der Unterordner. ForEach-Object durchläuft jede gefundene Datei.

      This script moves specific files (e.g., .pdf files) while keeping the folder structure intact:
Get-ChildItem -Path "C:\Temp" -Recurse -Filter "*.pdf" | ForEach-Object {
    $destinationPath = $_.FullName.Replace("C:\Temp", "C:\Backup")
    $destinationDir = Split-Path $destinationPath
    if (-not (Test-Path $destinationDir)) {
        New-Item -ItemType Directory -Path $destinationDir
    }
    Move-Item -Path $_.FullName -Destination $destinationPath
}
      
Image

Replace(“C:\Temp”, “C:\Backup”) passt den Quellpfad an, um den entsprechenden Pfad im Ziel zu erstellen, und New-Item -ItemType Directory erstellt die Ordnerstruktur, falls das Zielverzeichnis nicht existiert.

Überschreibungen verwalten

Gelegentlich müssen Sie vielleicht eine vorhandene Datei überschreiben. Verwenden Sie dafür den -Force Parameter zusammen mit dem PowerShell Move-Item Cmdlet.

Szenario 1 – Eine Datei am Zielort überschreiben

Dieses Cmdlet verschiebt die Datei test.txt aus dem Ordner C:\Temp in den Ordner C:\Backup und überschreibt dabei jede Datei, die am Zielort unter demselben Namen existieren könnte.

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
      
Image

Szenario 2 – Eine Datei am Ziel überschreiben nach Bestätigung

Verwenden Sie den -Confirm Parameter, um eine Bestätigungsaufforderung zu erhalten, bevor Dateien überschrieben werden.

  • Dieses Cmdlet zeigt eine Bestätigungsaufforderung an, wenn eine der PDF-Dateien bereits im Zielordner existiert.
      Move-Item -Path C:\Temp\*.pdf -Destination C:\Backup -Confirm -Force
      
  • Dieses Cmdlet zeigt eine Bestätigungsaufforderung an, wenn die Datei test.txt bereits im Zielordner existiert.
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup -Confirm -Force
      

Geben Sie Y ein und drücken Sie die Eingabetaste, um die Dateien zu überschreiben, oder geben Sie N ein und drücken Sie die Eingabetaste, um sie zu überspringen.

Image

Testbefehle vor der Ausführung

Verwenden Sie den -WhatIf-Parameter mit dem Move-Item-Cmdlet, um die Ergebnisse anzuzeigen, d.h., überprüfen Sie, was passieren würde, wenn das Cmdlet ausgeführt wird. Mit diesem Parameter wird das Cmdlet nicht ausgeführt, aber die erwarteten Ergebnisse werden angezeigt. Sie können daher sicher sein, dass das Cmdlet keinen Artikel verschiebt, der ansonsten nicht verschoben werden soll.

Szenario 1 – Das erwartete Ergebnis eines Cmdlets anzeigen, ohne es auszuführen

Dieses Cmdlet zeigt die Ergebnisse an, wenn Sie versuchen, mit dem Cmdlet Move-Item alle Elemente aus dem Ordner C:\Temp in den Ordner Backup zu verschieben.

      Move-Item -Path C:\Temp\* -Destination C:\Backup -WhatIf
      
Image

Fehlerbehandlung und Protokollierung

Sie sollten die Implementierung von Fehlerbehandlung und Protokollierung in Betracht ziehen, wenn Sie das Move-Item-Cmdlet von PowerShell verwenden, um sicherzustellen, dass das Skript wie erwartet funktioniert und Probleme leicht verfolgt und identifiziert werden können. PowerShell bietet:

  • Try-Catch für die Fehlerbehandlung
  • Write-Log, um in Logdateien zu schreiben

Grundlegende Fehlerbehandlung mit Try-Catch

Folgend finden Sie einen grundlegenden Try-Catch-Block zum Verschieben einer Datei mit Fehlerbehandlung:

      Try {
    Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -ErrorAction Stop
} Catch {
    Write-Output "Error moving file: $_"
}
      
Image

Hier ist, was Sie wissen müssen.

  • Der Try-Block versucht, das Cmdlet Move-Item auszuführen.
  • Der -ErrorAction Stop-Parameter weist PowerShell an, die Aktion zu stoppen und einen Fehler auszulösen, falls ein Problem auftritt (zum Beispiel, wenn die Datei nicht existiert oder es Berechtigungsprobleme gibt) und den Catch-Block zu betreten.
  • -Der Catch-Block fängt den Fehler ab, den das Move-Item-Cmdlet auslöst.
  • Write-Output zeigt die Fehlermeldung an ($_ enthält die Fehlerdetails). Sie können Write-Output auch durch Protokollierungsfunktionen wie Write-Log ersetzen, um den Fehler in einer Protokolldatei zu speichern.

Der -ErrorAction-Parameter legt fest, was passieren soll, wenn ein Fehler auftritt. Mögliche Werte sind:

  • Stopp – Der Vorgang wird bei dem Fehler angehalten
  • Fortsetzen – Der Vorgang wird nach einem Fehler fortgesetzt
  • SilentlyContinue – Der Vorgang wird den Fehler ignorieren, ohne etwas anzuzeigen
  • Anfragen – Fordert den Benutzer bei einem Fehler zur Eingabe auf
  • Ignorieren – Ignoriert den Fehler

Active Directory Group Management Best Practices

Learn more

Best Practices für die Dateiverwaltung mit PowerShell

Beschränken Sie das Cmdlet auf einen Quell- und Zielordner

Das Move-Item-Cmdlet erstellt keinen Ordner oder die Verzeichnisstruktur am Zielort. Sie können auch nicht gleichzeitig zwei Dateien mit demselben Namen aus zwei verschiedenen Quellorten verschieben. Daher ist es am besten, einen Quellordner und einen Zielordner in einem Cmdlet anzugeben.

Planen Sie die Dateiorganisation

Sie müssen sich über die Struktur Ihrer Dateiorganisation im Klaren sein, insbesondere bevor Sie Dateien in großen Mengen verschieben. Zuerst muss das Quellverzeichnis mit ordnungsgemäß gepflegten Dateien und Ordnern organisiert sein, damit Sie beim Verschieben der Elemente wissen, was bewegt wird. Zweitens muss die Ordnerstruktur am Zielort gut definiert sein, damit jedes Element wie gewünscht verschoben wird. Dies hilft Ihnen, jede verschobene Datei leicht zu finden.

Testen Sie Cmdlets anhand von Beispieldaten

Testen Sie das Move-Item-Cmdlet anhand von Beispieldaten, um sicherzustellen, dass die Ergebnisse wie erwartet ausfallen. Dies wird helfen, jegliche Unachtsamkeit bezüglich Überschreibungen oder Konflikten zu erkennen.

Wenn Sie nicht genügend Beispieldaten haben oder Zeit sparen möchten, verwenden Sie den -WhatIf-Parameter, um den Umzug zu simulieren, ohne das Cmdlet tatsächlich auszuführen. Auf diese Weise können Sie Cmdlets und Skripte testen, um das Ergebnis zu sehen, bevor Sie Änderungen vornehmen.

Erstellen Sie Sicherungen

Als Vorsichtsmaßnahme sollten Sie alle wichtigen Dateien und Ordner sichern, bevor Sie das Move-Item-Cmdlet verwenden, insbesondere die überschreibenden – um später keine Desorientierung zu erleben.

Implementieren Sie Protokollierung und Fehlerbehandlung

Protokollierung und Fehlerbehandlung sind nützliche Werkzeuge, um unerwartete Fehler zu bewältigen. Die Implementierung dieser hilft dabei, Fehler bei den Move-Item-Operationen zu identifizieren und zu verfolgen.

Sie können entweder den -ErrorAction Parameter oder die try-catch Blöcke in Ihren Cmdlets zur Fehlerbehandlung verwenden.

Fazit

Das PowerShell Move-Item Cmdlet besitzt die Kraft eines Zauberers, wenn es um die Verwaltung und Organisation von Dateien geht. Es richtet sich sowohl an Anfänger als auch an fortgeschrittene Benutzer mit einer einfachen Syntax als Grundlage, die mit Parametern und Skripten erweitert werden kann. Sie können eine einzelne Datei, mehrere Dateien, versteckte und schreibgeschützte Dateien, ein ganzes Verzeichnis mit all seinem Inhalt an einen anderen Ort verschieben, eine Datei beim Verschieben umbenennen, Überschreibungen handhaben und vieles mehr. Das Cmdlet unterstützt auch Protokollierung und Fehlerbehandlung, um sicherzustellen, dass Dateiverschiebungen zuverlässig und sicher sind.

Netwrix Directory Manager

FAQs

Was passiert, wenn eine Datei mit demselben Namen bereits am Zielort existiert?

Wenn Sie versuchen, eine Datei mit dem Move-Item-Cmdlet zu verschieben und im Zielort bereits eine Datei mit demselben Namen existiert, dann tritt einer der folgenden Fälle ein:

  • Das Cmdlet Move-Item wird ohne den Parameter -Force ausgeführt
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt
      

Das Cmdlet löst einen Fehler aus und verschiebt die Datei nicht.

  • Mit dem -Force-Parameter:

PowerShell wird die Datei am Zielort überschreiben, ohne um Bestätigung zu bitten. Dies wird die Datei am Zielort durch die Datei ersetzen, die Sie verschieben.

Siehe den Abschnitt Handle Overwrites für weitere Informationen.

Kann ich mehrere Dateien gleichzeitig verschieben?

Ja, das ist möglich mit PowerShell's Move-Item. Sie können:

  • Verschieben Sie Dateien mit derselben Erweiterung, Dateien mit unterschiedlichen Erweiterungen und alle Dateien aus dem Stammverzeichnis eines Quellverzeichnisses. Sie können das folgende Cmdlet verwenden, um alle Dateien aus dem Stamm des Quellverzeichnisses zu verschieben:
      Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
      

Siehe den Abschnitt Move Multiple Files für Details.

  • Um alle Dateien derselben Erweiterung rekursiv aus dem Quellverzeichnis zu verschieben, verwenden Sie dieses Cmdlet:
      Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
      

Siehe den Abschnitt Recursive File Moving für Details.

  • Verschieben Sie das Quellverzeichnis mit all seinen Inhalten mithilfe dieses Cmdlets:
      Move-Item -Path C:\Temp -Destination C:\Backup
      

Sehen Sie im Abschnitt Move a Directory nach, um Details zu erfahren.

  • Wie verschiebe ich Dateien mit bestimmten Attributen?

Das Move-Item-Cmdlet kann Dateien basierend auf bestimmten Kriterien verschieben, wie Dateigröße, Änderungsdatum und so weiter. Hier ist eine Liste der gängigen Attribute, nach denen Sie filtern können:

  • Versteckt
  • ReadOnly
  • Archiv
  • Komprimiert
  • Verschlüsselt

Verwenden Sie diese im Where-Object-Filter, um Dateien mit diesen Attributen zu zielen. Sie können auch mehrere Bedingungen mit -and oder -or in Where-Object kombinieren, um Dateien mit mehreren Attributen zu filtern.

Siehe die Themen Filter Files und Advanced Moving Scenarios für weitere Informationen.

Kann ich Move-Item verwenden, um Dateien zwischen verschiedenen Laufwerken zu verschieben?

Die einfache Antwort lautet ja. Dateien werden an den von Ihnen als Zielort angegebenen Ort verschoben, egal ob es sich um dasselbe Laufwerk wie das Quelllaufwerk handelt oder um ein anderes.


Wie verschiebt man eine Datei und überschreibt sie mit Move-Item?

Wenn Sie eine Datei am Zielort mit einer Datei, die Sie verschieben, überschreiben möchten, verwenden Sie den -Force Parameter mit Move-Item. Zum Beispiel:

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
      

PowerShell wird die test.txt-Datei im Backup-Ordner ohne Rückfrage durch die test.txt-Datei aus dem Temp-Ordner ersetzen. Siehe den Abschnitt Handle Overwrites für weitere Informationen.

Wie kann ich versteckte Dateien mit PowerShell verschieben?

Beim Verschieben eines Ordners oder mehrerer Dateien mit derselben Erweiterung verschiebt das Move-Item-Cmdlet keine versteckten oder schreibgeschützten Dateien. Verwenden Sie das Get-ChildItem-Cmdlet mit dem -Force-Parameter, um versteckte und Systemdateien in die Ausgabe einzubeziehen, und leiten Sie dann die Ergebnisse an Move-Item weiter.
Sie können dieses Cmdlet beispielsweise verwenden, um alle Dateien, einschließlich der versteckten Dateien, zu verschieben.

      Get-ChildItem -Path C:\Temp\ -Force | Move-Item -Destination C:\Backup\
      

Um speziell versteckte Dateien (und nicht sichtbare Dateien) zu verschieben, verwenden Sie dieses Cmdlet:

      Get-ChildItem -Path C:\Temp\ -Force | Where-Object { $_.Attributes -match 'Hidden' } | Move-Item -Destination C:\Backup\
      

Da Sie eine Bedingung hinzugefügt haben, um versteckte Dateien zu filtern, verschiebt das Cmdlet nur die Dateien, die das „Hidden“-Attribut gesetzt haben.

Welche sind einige häufige Fehler beim Verwenden von Move-Item und wie kann ich sie beheben?

Im Folgenden finden Sie einige häufige Fehler zusammen mit ihrer Erklärung und Lösung.

Datei existiert bereits

Wenn Sie versuchen, eine Datei oder einen Ordner an einen Zielort zu verschieben, an dem bereits eine Datei mit demselben Namen existiert, wird folgender Fehler angezeigt:

      Move-Item : Cannot create a file when that file already exists.
      

Verwenden Sie den -Force Parameter, um die vorhandene Datei zu überschreiben.

Zugriff verweigert

Wenn Sie nicht über die erforderlichen Berechtigungen verfügen, um die Datei zu verschieben, wird folgender Fehler angezeigt:

      Move-Item : Access to the path 'C:\Path\to\file.txt' is denied.
      

Es könnte viele Gründe dafür geben, wie zum Beispiel, dass die Datei geschützt ist, der Zielordner Adminrechte erfordert oder die Datei von einem anderen Prozess verwendet wird.

Um das Problem zu beheben, stellen Sie sicher, dass Sie die erforderlichen Berechtigungen haben. Es wird empfohlen, PowerShell als Administrator auszuführen. Stellen Sie außerdem sicher, dass die Datei nicht von einer anderen Anwendung verwendet wird.

Datei durch einen anderen Prozess gesperrt

Wenn die zu verschiebende Datei von einem anderen Programm oder Prozess verwendet wird, wird folgender Fehler angezeigt:

      Move-Item : The process cannot access the file because it is being used by another process.
      

To resolve the issue, close any applications using the file.

Pfad zu lang

Standardmäßig hat Windows eine maximale Pfadlänge von 260 Zeichen, und Move-Item schlägt fehl, wenn der Quell- oder Zielpfad dieses Limit überschreitet. PowerShell zeigt den folgenden Fehler an:

      Move-Item : The specified path, file name, or both are too long.
      

Um das Problem zu beheben, verwenden Sie entweder kürzere Verzeichnis- oder Dateinamen, oder aktivieren Sie die Unterstützung für lange Pfade in Windows 10/11 oder Windows Server über die Group Policy oder die Registrierung.

Ungültiger Pfad oder Dateiname

Wenn der Quellpfad oder der Zielpfad falsch, falsch geschrieben oder nicht vorhanden ist, wird folgende Fehlermeldung angezeigt:

      Move-Item : Cannot find path 'C:\InvalidPath\file.txt' because it does not exist.
      

Überprüfen Sie den Pfad noch einmal.

Zielverzeichnis existiert nicht

Wenn das Zielverzeichnis nicht existiert, wird folgender Fehler angezeigt:

      Move-Item : Could not find part of the path 'C:\Backup\'
      

Stellen Sie sicher, dass das Zielverzeichnis existiert. Andernfalls erstellen Sie es, bevor Sie die Dateien verschieben.

Ein Verzeichnis in sich selbst verschieben

PowerShell erlaubt es Ihnen nicht, ein Verzeichnis in eines seiner Unterverzeichnisse zu verschieben. Wenn Sie es versuchen, wird folgender Fehler angezeigt:

      Move-Item : Cannot move item 'C:\Temp\' to a subdirectory of itself, 'C:\Temp\Logs\'.
      

Stellen Sie sicher, dass das Ziel kein Unterordner des Quellverzeichnisses ist.

Ist es möglich, Dateien basierend auf ihrem Inhalt zu verschieben?

By itself, the Move-Item cmdlet cannot move files based on their content. You can, however, use Get-Content or other file reading methods with conditional logic (such as If-Else statements) to read the content of a file and then use Move-Item to move the file accordingly.

Hier ist ein Beispiel-Skript, das überprüft, ob eine Datei ein bestimmtes Wort oder eine Phrase enthält. Wenn ja, wird die Datei verschoben.

Hinweis: Nehmen Sie die folgenden Änderungen vor, bevor Sie das Skript ausführen:

  • Ändern Sie die Variable $searchString, um den Inhalt zu filtern, den Sie suchen.
  • Ändern Sie $sourceDirectory und $destinationDirectory zu den entsprechenden Pfaden.
      $sourceDirectory = "C:\SourceFolder"
$destinationDirectory = "C:\DestinationFolder"
$searchString = "SpecificText"
# Get all files in the source directory
Get-ChildItem -Path $sourceDirectory -File | ForEach-Object {
    $filePath = $_.FullName
    # Read the content of the file
    $content = Get-Content -Path $filePath
    # Check if the file contains the search string
    if ($content -match $searchString) {
        # Move the file to the destination directory
        $destinationPath = Join-Path -Path $destinationDirectory -ChildPath $_.Name
        Move-Item -Path $filePath -Destination $destinationPath
        Write-Host "Moved file: $filePath to $destinationPath"
    }
    else {
        Write-Host "File does not contain search string: $filePath"
    }
}
      

Get-ChildItem ruft alle Dateien aus dem Quellordner ab und ForEach-Object durchläuft jede Datei. Get-Content liest den Inhalt jeder Datei, um zu überprüfen, ob der Inhalt mit der angegebenen Zeichenfolge übereinstimmt. Anschließend verschiebt Move-Item die Dateien, die die Zeichenfolge enthalten, in den Zielordner.

Was ist, wenn die Datei, die ich versuchen zu verschieben, nicht existiert oder der Quellpfad nicht gültig ist?

In beiden Fällen wird PowerShell einen Fehler ausgeben.

      Move-Item : Cannot find path 'C:\Temp\AppLog.txt' because it does not exist.
      

Ebenso, wenn ein Element des Zielverzeichnisses nicht existiert, schlägt das Cmdlet fehl. Es erstellt kein fehlendes Verzeichnis oder irgendein Element des Pfades.

Eine gute Idee ist es, Test-Path auszuführen, um zu überprüfen, ob die Datei existiert. Dieses Cmdlet gibt $true zurück, wenn alle Elemente des Pfades vorhanden sind und $false, wenn welche fehlen.

      Test-Path -Path C:\Backups\AppLogs
      

False

Image

Teilen auf

Erfahren Sie mehr

Über den Autor

Asset Not Found

Jonathan Blackwell

Leiter der Softwareentwicklung

Seit 2012 hat Jonathan Blackwell, ein Ingenieur und Innovator, eine führende Rolle in der Ingenieurskunst übernommen, die Netwrix GroupID an die Spitze des Gruppen- und Benutzermanagements für Active Directory und Azure AD Umgebungen gebracht hat. Seine Erfahrung in Entwicklung, Marketing und Vertrieb ermöglicht es Jonathan, den Identity-Markt und die Denkweise der Käufer vollständig zu verstehen.