Direktes Verarbeiten von Elementen

Die Elemente, die auf PowerShell-Laufwerken angezeigt werden, z. B. Dateien und Ordner oder Registrierungsschlüssel werden in PowerShell als Elemente (Items) bezeichnet. Die Cmdlets zum Arbeiten mit diesen Elementen haben das Substantiv Item in ihren Namen.

Die Ausgabe des Befehls Get-Command -Noun Item zeigt, dass es neun PowerShell-Element-Cmdlets gibt.

Get-Command -Noun Item
CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Clear-Item                      Clear-Item [-Path] <String[]...
Cmdlet          Copy-Item                       Copy-Item [-Path] <String[]>...
Cmdlet          Get-Item                        Get-Item [-Path] <String[]> ...
Cmdlet          Invoke-Item                     Invoke-Item [-Path] <String[...
Cmdlet          Move-Item                       Move-Item [-Path] <String[]>...
Cmdlet          New-Item                        New-Item [-Path] <String[]> ...
Cmdlet          Remove-Item                     Remove-Item [-Path] <String[...
Cmdlet          Rename-Item                     Rename-Item [-Path] <String>...
Cmdlet          Set-Item                        Set-Item [-Path] <String[]> ...

Erstellen von neuen Elementen

Um ein neues Element im Dateisystem zu erstellen, verwenden Sie das Cmdlet New-Item. Fügen Sie den Path-Parameter mit dem Pfad zum Element und den ItemType-Parameter mit dem Wert file oder directory ein.

Geben Sie z. B. Folgendes ein, um ein neues Verzeichnis namens New.Directory im Verzeichnis C:\Temp zu erstellen:

New-Item -Path c:\temp\New.Directory -ItemType Directory
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18  11:29 AM            New.Directory

Um eine Datei zu erstellen, ändern Sie den Wert des ItemType-Parameters in file. Geben Sie z. B. Folgendes ein, um eine Datei namens file1.txt im Verzeichnis New.Directory zu erstellen:

New-Item -Path C:\temp\New.Directory\file1.txt -ItemType file
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-18  11:44 AM          0 file1

Auf gleiche Weise können Sie einen neuen Registrierungsschlüssel erstellen. Tatsächlich ist ein Registrierungsschlüssel einfacher zu erstellen, weil der einzige Elementtyp in der Windows-Registrierung ein Schlüssel ist. (Registrierungseinträge sind Element-Eigenschaften.) Wenn Sie beispielsweise einen Schlüssel namens _Test im Unterschlüssel CurrentVersion erstellen möchten, geben Sie Folgendes ein:

New-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\_Test
   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

SKC  VC Name                           Property
---  -- ----                           --------
  0   0 _Test                          {}

Wenn Sie einen Registrierungspfad eingeben, müssen Sie den Doppelpunkt (:) in die PowerShell-Laufwerksnamen, HKLM: und HKCU:, einfügen. Ohne den Doppelpunkt erkennt PowerShell den Laufwerknamen im Pfad nicht.

Warum Registrierungswerte keine Elemente sind

Wenn Sie mit dem Cmdlet Get-ChildItem nach den Elementen in einem Registrierungsschlüssel suchen, werden weder die tatsächlichen Registrierungseinträge noch deren Werte angezeigt.

So enthält der Registrierungsschlüssel HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run in der Regel mehrere Registrierungseinträge, die Anwendungen repräsentieren, die beim Systemstart ausgeführt werden.

Wenn Sie Get-ChildItem verwenden, um nach untergeordnete Elementen im Schlüssel zu suchen, wird nur der OptionalComponents-Unterschlüssel des Schlüssels angezeigt:

Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Run
   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
SKC  VC Name                           Property
---  -- ----                           --------
  3   0 OptionalComponents             {}

Zwar wäre es praktisch, wenn Registrierungseinträge wie Elemente behandelt werden könnten, es ist aber nicht möglich, einen Pfad zu einem Registrierungseintrag so anzugeben, dass seine Eindeutigkeit sicherstellt ist. In der Pfadnotation wird nicht zwischen dem Registrierungsunterschlüssel Run und dem (Standard-)Registrierungseintrag im Unterschlüssel Run unterschieden. Darüber hinaus könnten Sie – wenn Registrierungseinträge Elemente wären – die Pfadnotation nicht dazu verwenden, einen Registrierungseintrag namens Windows\CurrentVersion\Run von dem Unterschlüssel zu unterscheiden, der sich in diesem Pfad befindet, denn Registrierungseintragsnamen können den umgekehrten Schrägstrich (\) enthalten.

Umbenennen vorhandener Elemente

Um den Namen einer Datei oder eines Ordners zu ändern, verwenden Sie das Cmdlet Rename-Item. Der folgende Befehl ändert den Namen der Datei file1.txt in fileOne.txt.

Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt

Das Cmdlet Rename-Item kann den Namen einer Datei oder eines Ordners ändern, aber kein Element verschieben. Der folgende Befehl schlägt fehl, weil er versucht, die Datei aus dem Verzeichnis New.Directory in das Verzeichnis „Temp“ zu verschieben.

Rename-Item -Path C:\temp\New.Directory\fileOne.txt c:\temp\fileOne.txt
Rename-Item : can't rename because the target specified isn't a path.
At line:1 char:12
+ Rename-Item  <<<< -Path C:\temp\New.Directory\fileOne c:\temp\fileOne.txt

Verschieben von Elementen

Um eine Datei oder einen Ordner zu verschieben, verwenden Sie das Cmdlet Move-Item.

Der folgende Befehl verschiebt z. B. das Verzeichnis „New.Directory“ aus dem Verzeichnis C:\temp in das Stammverzeichnis von Laufwerk C:. Wenn Sie überprüfen möchten, ob das Element verschoben wurde, fügen Sie den PassThru-Parameter des Move-Item-Cmdlets ein. Ohne PassThru zeigt das Cmdlet Move-Item keine Ergebnisse an.

Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18  12:14 PM            New.Directory

Kopieren von Elementen

Wenn Sie mit den Kopiervorgängen in anderen Shells vertraut sind, finden Sie das Verhalten des Cmdlets Copy-Item in PowerShell möglicherweise ungewöhnlich. Wenn Sie ein Element von einem Speicherort an einen anderen kopieren, kopiert Copy-Item standardmäßig nicht den Inhalt des Elements.

Wenn Sie z. B. das Verzeichnis New.Directory von Laufwerk „C:“ in das Verzeichnis C:\temp kopieren, wird der Befehl erfolgreich ausgeführt, aber die Dateien im Verzeichnis „New.Directory“ werden nicht kopiert.

Copy-Item -Path C:\New.Directory -Destination C:\temp

Wenn Sie den Inhalt von C:\temp\New.Directory anzeigen, stellen Sie fest, dass es keine Dateien enthält:

PS> Get-ChildItem -Path C:\temp\New.Directory
PS>

Warum kopiert das Cmdlet Copy-Item den Inhalt nicht in den neuen Speicherort?

Das Cmdlet Copy-Item wurde als generisches Cmdlet entworfen, d. h., es ist nicht nur zum Kopieren von Dateien und Ordnern vorgesehen. Außerdem könnte es sein, auch wenn Dateien und Ordner kopiert werden, dass Sie nur den Container und nicht die Elemente im Container kopieren möchten.

Wenn Sie den gesamten Inhalt eines Ordners kopieren möchten, fügen Sie den Recurse-Parameter des Copy-Item-Cmdlets in den Befehl ein. Wenn Sie das Verzeichnis bereits ohne Inhalt kopiert haben, fügen Sie den Force-Parameter ein, der es ermöglicht, dass der leere Ordner überschrieben wird.

Copy-Item -Path C:\New.Directory -Destination C:\temp -Recurse -Force -Passthru
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18   1:53 PM            New.Directory

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-18  11:44 AM          0 file1

Löschen von Elementen

Um Dateien und Ordner zu löschen, verwenden Sie das Cmdlet Remove-Item. PowerShell-Cmdlets wie Remove-Item, die erhebliche, nicht rückgängig zu machende Änderungen vornehmen, fordern häufig zu einer Bestätigung auf, wenn Sie deren Befehle eingeben. Wenn Sie beispielsweise versuchen, den Ordner New.Directory zu entfernen, werden Sie aufgefordert, den Befehl zu bestätigen, da der Ordner Dateien enthält:

Remove-Item C:\temp\New.Directory
Confirm
The item at C:\temp\New.Directory 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"):

Da Yes die Standardantwort ist, drücken Sie die EINGABETASTE, um den Ordner und alle in ihm enthaltenen Dateien zu löschen. Um den Ordner ohne Bestätigung zu löschen, verwenden Sie den Recurse-Parameter.

Remove-Item C:\temp\New.Directory -Recurse

Ausführen von Elementen

PowerShell verwendet das Invoke-Item-Cmdlet, um eine Standardaktion für eine Datei oder einen Ordner auszuführen. Diese Standardaktion ist durch den Standardanwendungshandler in der Registrierung festgelegt. Der Effekt ist derselbe, als würden Sie im Datei-Explorer auf das Element doppelklicken.

Nehmen Sie an, Sie führen den folgenden Befehl aus:

Invoke-Item C:\WINDOWS

Ein Explorer-Fenster, das sich in C:\Windows befindet, wird angezeigt, genau so, als hätten Sie auf den Ordner C:\Windows doppelgeklickt.

Wenn Sie die Datei Boot.ini auf einem System vor Windows Vista aufrufen:

Invoke-Item C:\boot.ini

Ist der .ini-Dateityp mit Editor verknüpft ist, wird die Datei boot.ini in Editor geöffnet.