15/11/2024

Comment copier des fichiers en PowerShell avec Copy-Item ?

I. Présentation

Dans ce chapitre, nous allons apprendre à utiliser la commande PowerShell "Copy-Item" qui est utile pour copier un fichier d'un dossier vers un autre dossier, mais également un ensemble de données. Nous allons voir comment utiliser ce cmdlet au travers plusieurs exemples, car il s'avère pratique pour copier des données.

Ces exemples permettent d'effectuer des actions simples, mais qui répondent à des cas fréquents ! C'est une alternative à la commande historique "xcopy", mais également à l'excellent outil en ligne de commande "robocopy".

II. Copier un fichier avec PowerShell

Commençons simple avec la copie d'un fichier d'un dossier A vers un dossier B. Pour ce premier exemple, je travaille dans le dossier "C:\TEMP\PS\", où je crée "DossierA", "DossierB", et un fichier nommé "it-connect-1.txt" dans "DossierA".

New-Item -ItemType Directory -Path "C:\TEMP\PS\" -Name "DossierA"
New-Item -ItemType Directory -Path "C:\TEMP\PS\" -Name "DossierB"
New-Item -ItemType File -Path "C:\TEMP\PS\DossierA\" -Name "it-connect-1.txt"

Maintenant, nous allons déplacer ce fichier de "DossierA" vers "DossierB" :

Copy-Item -Path "C:\TEMP\PS\DossierA\it-connect-1.txt" -Destination "C:\TEMP\PS\DossierB\"

Le fichier est bien copié (et non déplacé)  :

PowerShell - Copy-Item - Copier un fichier

Dans l'exemple précédent, nous conservons le même nom entre la source te la destination. Néanmoins, nous pouvons faire en sorte que le fichier change de nom dans la destination. Par exemple, si nous souhaitons que la copie soit nommée "it-connect-2.txt" :

Copy-Item -Path "C:\TEMP\PS\DossierA\it-connect-1.txt" -Destination "C:\TEMP\PS\DossierB\it-connect-2.txt"

Nous pouvons aussi raccourcir cette commande, en utilisant "Copy" qui est l'alias de "Copy-Item" est en spécifiant, dans l'ordre : la source et la destination. Néanmoins, n'oubliez pas que l'utilisation des alias est déconseillé dans les scripts PowerShell.

Copy "C:\TEMP\PS\DossierA\it-connect-1.txt" "C:\TEMP\PS\DossierB\"

III. Copier les fichiers en appliquant un filtre

Pour cet autre cas pratique, nous allons voir comment copier des fichiers en appliquant un filtre afin d'inclure ou d'exclure uniquement les fichiers avec une extension spécifique. Pour avoir un peu plus de matière, j'ai créé quelques fichiers TXT et des fichiers JPG dans mon dossier "DossierA" :

PowerShell - Copy-Item - Copier avec un filtre

Par exemple, nous allons seulement copier les fichiers ".JPG" du répertoire "DossierA" vers "DossierB". Ce qui donne un filtre avec le paramètre "-Include" et au niveau du chemin source, nous ajoutons aussi le caractère widlcard ("*") pour inclure tout le contenu de ce dossier (qui sera filtré grâce à -Include) :

Copy-Item -Path "C:\TEMP\PS\DossierA\*" -Destination "C:\TEMP\PS\DossierB\" -Include *.jpg

Il est à noter que dans l'exemple précédent, basé sur "-Include", il n'est pas possible d'ajouter "-Recurse" et donc d'inclure les fichiers correspondants au filtre et présents dans les sous-dossiers. Le filtre "-Include" s'applique uniquement sur le dossier de premier niveau. Par contre, le paramètre "-Recurse" fonctionne avec les exclusions.

Dans mon dossier, j'ai des fichiers "TXT" et des fichiers "JPG", si je souhaite copier uniquement les fichiers JPG, je dois exclure l'extension "TXT", comme ceci :

Copy-Item -Path "C:\TEMP\PS\DossierA\*" -Destination "C:\TEMP\PS\DossierB\" -Exclude *.txt -Recurse

Le fait d'ajouter "-Recurse" permet aussi de copier les fichiers situés dans des sous-dossiers, en créant également le dossier dans la destination afin de reproduire l'arborescence.

IV. Copier un fichier vers un ordinateur distant

Le cmdlet "Copy-Item" ne contient pas de paramètre "-Computer" permettant de spécifier un ordinateur de destination, mais il a un paramètre "-ToSession" qui permet de copier des données vers un ordinateur distant en utilisant une session PowerShell.

Voici un exemple ci-dessous, tout en sachant que l'inverse est possible aussi : copier des données de l'ordinateur distant, vers l'ordinateur local, en utilisant le paramètre "-FromSession" sur le même principe.

Ceci implique d'activer la Gestion à distance de Windows (WinRM) et de créer une session PowerShell.

Dans cet exemple, la session PowerShell cible l'ordinateur "PC-01" et l'authentification est effectuée avec le compte "IT-Connect\florian".

$Session = New-PSSession -ComputerName "PC-01" -Credential "IT-Connect\florian"

Une fois la session connectée, nous pouvons copier un fichier sur l'ordinateur distant en appelant cette session. Ici, nous copions le fichier "C:\Temp\PS\DossierA\it-connect-1.txt" vers "C:\TEMP\" (chemin local sur l'ordinateur cible).

Copy-Item -Path "C:\Temp\PS\DossierA\it-connect-1.txt" -Destination "C:\TEMP\" -ToSession $Session
PowerShell - Copy-Item - Copier sur ordinateur distant

V. Copier un dossier complet avec PowerShell

Nous allons évoquer un autre cas que vous êtes susceptible de rencontrer : copier l'intégralité d'une arborescence d'un emplacement vers un autre. Ainsi, nous pouvons copier tout le contenu de "DossierA", c'est-à-dire ses fichiers, ainsi que ses sous-dossiers et leur contenu, vers le "DossierB". Autrement dit, nous allons effectuer une copie de données avec récursivité.

Copy-Item -Path "C:\TEMP\PS\DossierA\*" -Destination "C:\TEMP\PS\DossierB\" -Recurse

Si nous retirons le paramètre "-Recurse", alors nous copions uniquement les fichiers situés dans le répertoire de premier niveau. Ceci signifie que nous ignorons les sous-dossiers.

VI. Copier plusieurs dossiers vers un emplacement unique

Dans le cas où nous souhaitons copier le contenu de plusieurs dossiers sources vers une même destination (fusionner le contenu des dossiers), il sera nécessaire de séparer les répertoires sources par une virgule. Quant au dossier de destination, il n'est pas obligatoire de le créer : il pourra être créé lors de la copie.

Pour déplacer le contenu des dossiers "DossierA" et "DossierB" vers "DossierC", cela donne :

Copy-Item -Path "C:\TEMP\PS\DossierA\*","C:\TEMP\PS\DossierB\*" -Destination "C:\TEMP\PS\DossierC\"

Dans le même esprit avec la récursivité :

Copy-Item -Path "C:\TEMP\PS\DossierA\*","C:\TEMP\PS\DossierB\*" -Destination "C:\TEMP\PS\DossierC\" -Recurse

Attention aux éventuels conflits sur des noms, qui peuvent générer quelques erreurs sans pour autant empêcher le reste de la copie.

VII. Conclusion

Vous êtes désormais en mesure de copier des fichiers avec PowerShell en utilisant la commande "Copy-Item" !


livre pour apprendre PowerShell
author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.