Manipulation d’éléments de manière directe

Les éléments que vous voyez dans les lecteurs PowerShell, tels que les fichiers et dossiers ou les clés de registre, sont appelés Éléments (Items) dans PowerShell. Les applets de commande associées à ces éléments comportent le nom Item dans leur intitulé.

La sortie de la commande Get-Command -Noun Item montre qu’il y a neuf applets de commande pour les éléments PowerShell.

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[]> ...

Créer des éléments

Pour créer un élément dans le système de fichiers, utilisez l’applet de commande New-Item. Indiquez le chemin de l’élément dans le paramètre Path, et la valeur file ou directory dans le paramètre ItemType.

Par exemple, pour créer un répertoire nommé New.Directory dans le répertoire C:\Temp, tapez :

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

Pour créer un fichier, définissez la valeur du paramètre ItemType sur file. Par exemple, pour créer un fichier nommé file1.txt dans le répertoire New.Directory, tapez :

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

Vous pouvez utiliser la même technique pour créer une clé de Registre. En fait, une clé de Registre est plus facile à créer, car le seul type d'élément dans le Registre Windows est une clé. (Les entrées de Registre sont des propriétés d’élément.) Par exemple, pour créer une clé nommée _Test dans la sous-clé CurrentVersion, tapez :

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                          {}

Quand vous tapez un chemin de Registre, veillez à ajouter le signe deux-points (:) dans les noms de lecteur PowerShell HKLM: et HKCU:. Sans les deux-points, PowerShell ne reconnaît pas le nom du lecteur dans le chemin.

Pourquoi les valeurs de Registre ne sont pas des éléments

Quand vous utilisez l’applet de commande Get-ChildItem pour rechercher les éléments dans une clé de Registre, ni les entrées de Registre ni leurs valeurs n’apparaissent.

Par exemple, la clé de Registre HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run contient généralement plusieurs entrées de Registre qui représentent des applications s’exécutant au démarrage du système.

Toutefois, quand vous utilisez Get-ChildItem pour rechercher les éléments enfants dans la clé, tout ce que vous voyez est la sous-clé OptionalComponents de la clé :

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             {}

Bien qu’il serait pratique de traiter les entrées de Registre en tant qu’éléments, vous ne pouvez pas spécifier un chemin d’accès à une entrée de Registre d’une façon qui garantit son unicité. La notation de chemin d’accès ne fait pas la distinction entre la sous-clé de Registre nommée Run et l’entrée de Registre (Default) dans la sous-clé Run. Par ailleurs, comme les noms des entrées de Registre peuvent contenir une barre oblique inverse (\), si les entrées de Registre sont des éléments, vous ne pouvez pas utiliser la notation de chemin pour faire la distinction entre une entrée de Registre nommée Windows\CurrentVersion\Run et la sous-clé située dans ce chemin.

Attribution d’un nouveau nom aux éléments existants

Pour changer le nom d’un fichier ou d’un dossier, utilisez l’applet de commande Rename-Item. La commande suivante remplace le nom du fichier file1.txt par fileOne.txt.

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

L’applet de commande Rename-Item peut changer le nom d’un fichier ou d’un dossier, mais ne peut pas déplacer un élément. La commande suivante échoue, car elle tente de déplacer le fichier du répertoire New.Directory vers le répertoire Temp.

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

Déplacement d’éléments

Pour déplacer un fichier ou un dossier, utilisez l’applet de commande Move-Item.

Par exemple, la commande suivante déplace le répertoire New.Directory du répertoire C:\temp vers la racine du lecteur C:. Pour vérifier que l’élément a été déplacé, ajoutez le paramètre PassThru de l’applet de commande Move-Item. Sans PassThru, l’applet de commande Move-Item n’affiche aucun résultat.

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

Copie d’éléments

Si vous avez déjà effectué des opérations de copie dans d’autres interpréteurs de commandes, le comportement de l’applet de commande Copy-Item dans PowerShell peut vous sembler inhabituel. Quand vous copiez un élément d’un emplacement vers un autre, par défaut, Copy-Item ne copie pas son contenu.

Par exemple, si vous copiez le répertoire New.Directory du lecteur C: vers le répertoire C:\temp, la commande aboutit, mais les fichiers du répertoire New.Directory ne sont pas copiés.

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

Si vous affichez le contenu C:\temp\New.Directory, vous voyez qu’il ne contient aucun fichier :

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

Pourquoi l’applet de commande Copy-Item ne copie-t-elle pas le contenu vers le nouvel emplacement ?

L’applet de commande Copy-Item est une commande générique, elle ne sert pas simplement à copier des fichiers et des dossiers. En outre, même si vous copiez des fichiers et des dossiers, vous pouvez être amené à copier uniquement le conteneur et non les éléments qu'il contient.

Pour copier tout le contenu d’un dossier, ajoutez le paramètre Recurse de l’applet de commande Copy-Item dans la commande. Si vous avez déjà copié le répertoire sans son contenu, ajoutez le paramètre Force pour remplacer le dossier vide.

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

Suppression d’éléments

Pour supprimer des fichiers et des dossiers, utilisez l’applet de commande Remove-Item. Les applets de commande PowerShell comme Remove-Item, qui effectuent des changements importants et irréversibles, demandent souvent une confirmation quand vous entrez la commande. Par exemple, si vous essayez de supprimer le dossier New.Directory qui contient des fichiers, vous êtes invité à confirmer la commande :

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"):

Yes étant la réponse par défaut, pour supprimer le dossier et ses fichiers, appuyez sur la touche Entrée. Pour supprimer le dossier sans confirmation, utilisez le paramètre Recurse.

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

Exécution d’éléments

PowerShell utilise l’applet de commande Invoke-Item afin d’effectuer une action par défaut sur un fichier ou un dossier. Cette action par défaut est déterminée par le gestionnaire d'application par défaut dans le Registre. Vous obtenez le même résultat qu'en double-cliquant sur l'élément dans l'Explorateur de fichiers.

Par exemple, imaginez que vous exécutiez la commande suivante :

Invoke-Item C:\WINDOWS

Une fenêtre d’explorateur située dans C:\Windows s’affiche de la même façon que si vous double-cliquez sur le dossier C:\Windows.

Si vous appelez le fichier Boot.ini sur un système antérieur à Windows Vista :

Invoke-Item C:\boot.ini

Si le type de fichier .ini est associé au Bloc-notes, le fichier boot.ini s’ouvre dans le Bloc-notes.