Arbeiten mit Dateien und Ordnern

Das Navigieren auf PowerShell-Laufwerken und das Bearbeiten der darauf gespeicherten Elemente gleicht dem Bearbeiten von Dateien und Ordnern auf Windows-Festplattenlaufwerken. In diesem Artikel werden bestimmte Aufgaben im Zusammenhang mit der Bearbeitung von Dateien und Ordnern mithilfe von PowerShell erörtert.

Auflisten aller Dateien und Ordner in einem Ordner

Mit Get-ChildItem können Sie alle Elemente in einem Ordner direkt abrufen. Fügen Sie den optionalen Parameter Force hinzu, um ausgeblendete oder Systemelemente anzuzeigen. Dieser Befehl zeigt z. B. den unmittelbaren Inhalt des PowerShell-Laufwerks C: an.

Get-ChildItem -Path C:\ -Force

Der Befehl listet nur die Elemente auf, die sich unmittelbar in dem Ordner befinden, vergleichbar mit dem dir-Befehl in cmd.exe oder ls in einer UNIX-Shell. Um Elemente in Unterordnern anzuzeigen, müssen Sie den Recurse-Parameter angeben. Der folgende Befehl listet alle Elemente auf dem Laufwerk C: auf:

Get-ChildItem -Path C:\ -Force -Recurse

Get-ChildItem kann Elemente mithilfe der zugehörigen Parameter Path, Filter, Include und Exclude filtern, diese basieren allerdings typischerweise auf Namen. Zum Durchführen einer komplexen Filterung basierend auf anderen Elementeigenschaften können Sie Where-Object verwenden.

Der folgende Befehl sucht alle ausführbaren Dateien im Ordner „Programme“, die nach dem 1. Oktober 2005 zuletzt geändert wurden und weder kleiner als 1 MB noch größer als 10 MB sind:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
    Where-Object -FilterScript {
        ($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
    }

Kopieren von Dateien und Ordnern

Das Kopieren erfolgt mit Copy-Item. Mit dem folgenden Befehl wird Ihr PowerShell-Profilskript gesichert:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

Der Test-Path Befehl überprüft, ob das Profilskript vorhanden ist.

Wenn die Zieldatei bereits vorhanden ist, schlägt der Kopierversuch fehl. Zum Überschreiben eines vorhandenen Ziels verwenden Sie den Parameter Force:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}

Dieser Befehl funktioniert auch, wenn das Ziel schreibgeschützt ist.

Das Kopieren von Ordnern funktioniert auf dieselbe Weise. Dieser Befehl kopiert den Ordner C:\temp\test1 rekursiv in den neuen Ordner C:\temp\DeleteMe:

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

Sie können auch eine Auswahl von Elementen kopieren. Der folgende Befehl kopiert alle .txt-Dateien, die an beliebiger Stelle in C:\data enthalten sind, nach C:\temp\text:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

Sie können weiterhin systemeigene Befehle wie xcopy.exe und robocopy.exe zum Kopieren von Dateien ausführen.

Erstellen von Dateien und Ordnern

Das Erstellen neuer Elemente funktioniert bei allen PowerShell-Anbietern gleich. Wenn ein PowerShell-Anbieter über mehrere Elementtypen verfügt – der PowerShell-Anbieter FileSystem unterscheidet z. B. zwischen Verzeichnissen und Dateien – müssen Sie den Elementtyp angeben.

Mit diesem Befehl wird ein neuer Ordner C:\temp\New Folder erstellt:

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

Dieser Befehl erstellt eine neue leere Datei in C:\temp\New Folder\file.txt.

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

Wichtig

Wenn Sie den Befehl New-Item mit dem Schalter Force zum Erstellen eines Ordners verwenden und der Ordner bereits vorhanden ist, wird dieser nicht überschrieben oder ersetzt. Es wird lediglich das vorhandene Ordnerobjekt zurückgegeben. Wenn Sie New-Item -Force jedoch für eine Datei verwenden, die bereits vorhanden ist, wird die Datei überschrieben.

Entfernen aller Dateien und Ordner in einem Ordner

Mit Remove-Item können Sie enthaltene Elemente entfernen. Sie werden jedoch aufgefordert, das Entfernen zu bestätigen, wenn ein Element weitere Elemente enthält. Wenn Sie z. B. versuchen, den Ordner C:\temp\DeleteMe zu löschen, der weitere Elemente enthält, fordert PowerShell Sie vor dem Löschen des Ordners zur Bestätigung auf:

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

Wenn Sie nicht für jedes enthaltene Element aufgefordert werden möchten, geben Sie den Recurse-Parameter an:

Remove-Item -Path C:\temp\DeleteMe -Recurse

Zuordnen eines lokalen Ordners als Laufwerk

Sie können mithilfe des Befehls New-PSDrive auch einen lokalen Ordner zuordnen. Der folgende Befehl erstellt ein lokales Laufwerk P: im lokalen Verzeichnis „Programme“, das nur in der PowerShell-Sitzung sichtbar ist:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

Wie bei Netzlaufwerken sind in PowerShell zugeordnete Laufwerke für die PowerShell-Shell sofort sichtbar. Verwenden Sie den Persist-Parameter, um ein zugeordnetes Laufwerk zu erstellen, das im Datei-Explorer sichtbar ist. Mit Persist können aber nur Remotepfade verwendet werden.

Einlesen einer Textdatei in ein Array

Eine der häufigeren Speicherformate für Textdaten ist eine Datei mit separaten Zeilen, die als einzelne Datenelemente behandelt werden. Das Cmdlet Get-Content kann zum Lesen einer vollständigen Datei in einem Schritt verwendet werden, wie hier gezeigt:

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

Get-Content behandelt die aus der Datei gelesenen Daten als Array, mit je einem Element pro Zeile des Dateiinhalts. Sie können dies anhand der Länge (Length) des zurückgegebenen Inhalts überprüfen:

PS> (Get-Content -Path $PROFILE).Length
3

Dieser Befehl ist besonders hilfreich zum Abrufen von Listen mit Informationen in PowerShell. Beispielsweise können Sie eine Liste mit Computernamen oder IP-Adressen in der Datei C:\temp\domainMembers.txt speichern, wobei in jede Zeile der Datei je ein Name geschrieben wird. Mit Get-Content können Sie die Dateiinhalte abrufen und in die Variable $Computers einfügen:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers ist jetzt ein Array mit einem Computernamen in jedem Element.