Comment copier des fichiers en PowerShell avec Copy-Item ?

I. Présentation

Dans ce tutoriel, 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 "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 cette démo, 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, on va 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, on conserve le même nom entre la source te la destination. Néanmoins, on peut faire en sorte que le fichier change de nom dans la destination. Par exemple, qu'il s'appelle "it-connect-2.txt" :

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

On peut 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.

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

Je décide de copier de "DossierA" vers "DossierB" seulement les fichiers ".JPG". Ce qui donne un filtre avec le paramètre "-Include" et au niveau du chemin source, on ajoute aussi le caractère widlcard ("*") pour inclure tout le contenu de ce dossier (que l'on filtre 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 cible l'ordinateur "PC-01" et je m'authentifier avec le compte "IT-Connect\florian".

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

Une fois la session en place, on peut copier un fichier sur l'ordinateur distant en appelant la session. Ici, on copie "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

Autre cas : copier l'intégralité d'une arborescence d'un emplacement vers un autre. Ainsi, on peut copier tout le contenu de "DossierA", c'est-à-dire ses fichiers, ainsi que ses sous-dossiers et leur contenu, vers le "DossierB".

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

Si l'on retire le paramètre "-Recurse", alors on copie uniquement les fichiers situés dans le répertoire de premier niveau. Autrement dit, on ignore les sous-dossiers.

VI. Copier plusieurs dossiers vers un emplacement unique

Dans le cas où l'on souhaite 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 ! Si vous avez une idée pour un cas de figure supplémentaire, n'hésitez pas à laisser un commentaire sur cet article.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

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.

Nombre de posts de cet auteur : 5470.Voir tous les posts

2 thoughts on “Comment copier des fichiers en PowerShell avec Copy-Item ?

  • Bonjour, Florian
    J’aimerai faire une copie « sauvegarde » des profiles utilisateurs des pc client en PowerShell vers le serveur avec une GPO en tâche planifier, mais j’ai essayé avec copy-item Path $Env:Userprofile\Documents -destination \\SVR_1\Sauvegarde\$Env:Username, mais j’obtient seulement le profil admin du serveur.
    Si tu as une solution car je débute en PowerShell. Merci d’avance
    Cordialement,
    Hassan

    Répondre
  • Bonjour Florian,
    Je vous remercie pour cet article, ce pendant dans le scénario : « copié un dossier vers plusieurs dossiers »?

    Répondre

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.