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.