Das Navigieren durch Windows PowerShell-Laufwerke und das Ändern zugehöriger Elemente ähnelt dem Ändern von Dateien und Ordnern auf physischen Laufwerken von Windows. In diesem Abschnitt werden spezifische Änderungen für Dateien und Ordner besprochen.
Auflisten aller Dateien und Ordner in einem Ordner
Mit Get-ChildItem können Sie alle Elemente abrufen, die sich direkt in einem Ordner befinden. Wenn Sie den optionalen Force-Parameter hinzufügen, können Sie zusätzlich versteckte Elemente oder Systemelemente anzeigen. Mit dem folgenden Befehl wird beispielsweise der Inhalt des Windows PowerShell-Laufwerks "C" angezeigt (dies entspricht dem physischen Windows-Laufwerk "C:"):
Get-ChildItem -Force C:\
Mit diesem Befehl werden analog zum Befehl DIR von "Cmd.exe" oder ls in einer UNIX-Shell nur die direkt enthaltenen Elemente aufgelistet. Wenn Sie die enthaltenen Elemente anzeigen möchten, müssen Sie zusätzlich den -Recurse-Parameter angeben. (Zum Ausführen kann dann eine sehr lange Zeit erforderlich sein.) So führen Sie den gesamten Inhalt des Laufwerks "C" auf:
Get-ChildItem -Force C:\ -Recurse
Get-ChildItem kann Elemente anhand der Parameter Path, Filter, Include und Exclude filtern, doch basieren diese meist lediglich auf dem Namen. Eine komplexe Filterung können Sie anhand anderer Elementeigenschaften mit Where-Object ausführen.
Mit dem folgenden Befehl werden alle ausführbaren Dateien im Ordner "Programme" aufgelistet, die zuletzt am 1. Oktober 2005 geändert wurden und zwischen 1 und 10 Megabytes groß sind:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt "2005-10-01") -and ($_.Length -ge 1m) -and ($_.Length -le 10m)}
Kopieren von Dateien und Ordnern
Das Kopieren erfolgt mit Copy-Item. Mit dem folgenden Befehl wird eine Sicherungskopie des Laufwerks "C:\boot.ini" unter "C:\boot.bak" erstellt:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak
Wenn die Zieldatei bereits vorhanden ist, generiert der Kopiervorgang einen Fehler. Überschreiben Sie ein bereits vorhandenes Ziel mit dem Force-Parameter:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak -Force
Dieser Befehl kann auch dann verwendet werden, wenn das Ziel schreibgeschützt ist.
Ordner werden auf die gleiche Weise kopiert. Mit diesem Befehl wird der Ordner "C:\temp\test1" rekursiv auf den neuen Ordner "c:\temp\DeleteMe" kopiert:
Copy-Item C:\temp\test1 -Recurse c:\temp\DeleteMe
Sie können auch eine Auswahl von Elementen kopieren. Mit dem folgenden Befehl werden alle TXT-Dateien in "c:\data" nach "c:\temp\text" kopiert:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination c:\temp\text
Dateisystemkopien können auch weiterhin mit anderen Tools durchgeführt werden. In Windows PowerShell können XCOPY-, ROBOCOPY- und COM-Objekte verwendet werden, z. B. Scripting.FileSystemObject,. Beispielsweise können Sie "C:\boot.ini" mit der Scripting.FileSystem COM-Klasse des WSH (Windows Script Host) unter "C:\boot.bak" sichern:
(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")
Erstellen von Dateien und Ordnern
Das Erstellen neuer Elemente erfolgt für alle Windows PowerShell-Anbieter auf die gleiche Weise. Wenn ein Windows PowerShell-Anbieter mehrere Elementtypen aufweist, müssen Sie den Typ des Elements angeben, da z. B. der FileSystem-Anbieter von Windows PowerShell zwischen Verzeichnissen und Dateien unterscheidet.
Mit dem folgenden Befehl wird der Ordner "C:\temp\New Folder" erstellt:
New-Item -Path 'C:\temp\New Folder' -ItemType "directory"
Mit dem folgenden Befehl wird die neue Datei "C:\temp\New Folder\file.txt" erstellt:
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType "file"
Entfernen aller Dateien und Ordner in einem Ordner
Mit Remove-Item können Sie enthaltene Elemente entfernen. Sie werden jedoch aufgefordert, diesen Vorgang zu bestätigen, wenn ein Element weitere Inhalte aufweist. Wenn Sie beispielsweise den Ordner "C:\temp\DeleteMe" löschen möchten, der weitere Elemente enthält, werden Sie von Windows PowerShell aufgefordert, den Vorgang zu bestätigen, bevor der Ordner gelöscht wird:
Remove-Item C:\temp\DeleteMe Confirm The item at C:\temp\DeleteMe has children and the -recurse parameter was not 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 Element eine Bestätigung vornehmen möchten, geben Sie den Recurse-Parameter an:
Remove-Item C:\temp\DeleteMe -Recurse
Zuordnen eines lokalen Ordners als Laufwerk mit Windows-Zugriff
Mit dem Befehl subst können Sie auch einen lokalen Ordner zuordnen. Mit dem folgenden Befehl wird das lokale Laufwerk "P:" im Verzeichnis "Programme" erstellt:
subst p: $env:programfiles
Ebenso wie Netzlaufwerke sind Laufwerke, die in Windows PowerShell mit subst zugeordnet wurden, in der Windows PowerShell-Sitzung sofort sichtbar.
Lesen einer Textdatei in einem Array
Textdaten werden häufig in einer Datei gespeichert, die aus einzelnen Zeilen besteht; diese werden als verschiedene Datenelemente behandelt. Mit dem Cmdlet Get-Content kann die gesamte Datei wie nachfolgend dargestellt in einem Schritt gelesen werden:
PS> Get-Content -Path C:\boot.ini [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=AlwaysOff /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional with Data Execution Prevention" /noexecute=optin /fastdetect
Get-Content behandelt die Daten in der Datei bereits als Array mit einem Element pro Zeile in der Datei. Dies können Sie mit dem Befehl Length für den zurückgegebenen Inhalt überprüfen:
PS> (Get-Content -Path C:\boot.ini).Length 6
Dieser Befehl ist sehr hilfreich, um Informationslisten unmittelbar in Windows PowerShell abzurufen. Beispielsweise können Sie eine Liste der Computernamen oder IP-Adressen in der Datei "C:\temp\domainMembers.txt" speichern, wobei für jeden Namen in der Datei eine eigene Zeile verwendet wird. Mit Get-Content können Sie den Inhalt der Datei abrufen und in der Variablen $Computers speichern:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers stellt nun ein Array mit einem Computernamen in jedem Element dar.