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.