Magic Quadrant™ pour la gestion des accès privilégiés 2025 : Netwrix reconnue pour la quatrième année consécutive. Téléchargez le rapport.

Plateforme
Centre de ressourcesBlog
Utilisation de la Cmdlet PowerShell Copy-Item pour copier des fichiers

Utilisation de la Cmdlet PowerShell Copy-Item pour copier des fichiers

Sep 16, 2024

Qu'est-ce que le Cmdlet PowerShell Copy-Item ?

La cmdlet Copy-Item dans Powershell est principalement utilisée pour copier des fichiers de la source à la destination. En termes de nombre de fichiers, cela peut être individuel ou multiple ainsi que leur contenu. Elle peut également fonctionner sur différents systèmes de fichiers tels que locaux, partages réseau, etc.

Syntaxe de base et paramètres

La syntaxe de base pour l'applet de commande PowerShell Copy-Item est la suivante :

      Copy-Item -Path <source> -Destination <destination> [<parameters>]
      

Si vous tapez uniquement le cmdlet, PowerShell vous demandera la Source, comme indiqué ci-dessous :

Image

Le premier paramètre obligatoire est le chemin source. Ce paramètre de chemin d'élément spécifie le chemin vers l'élément ou les éléments à copier. La source peut être un chemin de fichier ou de dossier. Plusieurs chemins peuvent être spécifiés en utilisant une liste séparée par des virgules, et le chemin peut contenir des caractères génériques. Une bonne pratique serait de fournir une chaîne de chemin de destination pour spécifier le chemin vers lequel les éléments doivent être copiés. Si vous copiez un seul élément, le chemin peut inclure un nouveau nom pour l'élément copié si souhaité.

Ci-dessous se trouve une liste d'autres paramètres pour le cmdlet PowerShell Copy-Item :

  • -Recurse: Copie les sous-dossiers et leur contenu de manière récursive, ce qui signifie que la cmdlet Copy-Item est appliquée au dossier de niveau supérieur et à tous les niveaux de sous-dossiers en dessous.
  • -Force parameter: Écrase les fichiers en lecture seule existants et crée les répertoires de destination s'ils n'existent pas.
  • -Container: Préserve les objets conteneurs lors des opérations de copie, ce qui est utile lors de la copie de structures de répertoires.
  • -Filter: Spécifie une chaîne de filtre pour qualifier le paramètre de chemin, comme spécifier une extension de fichier particulière
  • -Include: Spécifie les éléments à copier et prend en charge les caractères génériques. Seuls les éléments qui correspondent aux paramètres Path et Include sont copiés
  • -Exclude: Indique les éléments à exclure de la copie, prend en charge les caractères génériques
  • -Credential: Indique les informations d'identification du compte utilisateur à utiliser pour l'opération
  • -WhatIf: Indique ce qui se passerait si la commande était exécutée sans l'exécuter réellement
  • -Confirm: Demande une confirmation avant d'exécuter la commande
  • -FromSession: Spécifie l'objet PSSession à partir duquel obtenir un fichier distant.
  • -ToSession: Spécifie l'objet PSSession vers lequel envoyer un fichier distant

Cas d'utilisation courants

Pour la plupart des exemples, nous copierons des fichiers vers plusieurs emplacements sur l'ordinateur local. Il existe cependant une variété de cas d'utilisation courants pour le cmdlet Copy-Item, y compris :

  • Création de sauvegardes de fichiers et dossiers importants
  • Distribution de fichiers ou d'applications simples sur plusieurs machines
  • Migration de grandes quantités de fichiers entre des serveurs ou des emplacements de stockage
  • Les développeurs peuvent créer des instantanés des dossiers de projet à différents stades du développement.
  • Distribuez les fichiers de configuration sur plusieurs serveurs

Comparons maintenant le cmdlet Copy-Item avec d'autres cmdlets de gestion de fichiers :

Copy-Item vs. Move-Item :

  • Copy-Item crée un duplicata, laissant l'original intact
  • Move-Item déplace le fichier/dossier, en le supprimant de l'emplacement d'origine

Copy-Item vs. Get-ChildItem

  • Copy-Item effectue l'action de copie
  • Get-ChildItem répertorie les fichiers et dossiers et est souvent utilisé en conjonction avec Copy-Item

Notez que la cmdlet Copy-Item est recommandée pour la copie de fichiers de base. Ceux qui recherchent des fonctionnalités plus avancées pour le transfert de gros fichiers ou la duplication peuvent envisager Microsoft Robocopy.

Copie de fichiers avec l'applet de commande PowerShell Copy-Item

Exemple de copie de fichier basique

Dans cet exemple, nous souhaitons copier une feuille de calcul d'un dossier à un autre en utilisant la commande PowerShell copy item.

      Copy-Item -Path "C:\Destination One\SpreadsheetOne.xlsx" -Destination "c:\Destination Two"

      

Voici à quoi cela ressemble en PowerShell :

Image

Copier plusieurs fichiers

Maintenant, copions plusieurs fichiers à la fois. Notez que les chemins des fichiers utilisent différents lecteurs. N'oubliez pas que si le répertoire de destination n'existe pas, PowerShell le créera.

      Copy-Item -Path "C:\source\file1.txt","C:\Source\file2.txt" -Destination "D:\Destination Two"
      

Copie de fichiers avec renommage

Vous pouvez copier un fichier dans un nouveau dossier et le renommer pendant le processus en utilisant la commande ci-dessous :

      Copy-Item -Path "C:\Source\file1.txt" -Destination "C:\Destination Two\NewName1.txt"
      

Voici à quoi cela ressemble en PowerShell :

Image

Copie de dossiers avec PowerShell

La capacité de copie de PowerShell ne se limite pas aux fichiers – vous pouvez également copier un dossier à l'aide de la cmdlet Copy-Item vers de nouveaux emplacements. Ci-dessous, nous vous montrons comment utiliser la commande de copie de dossier et de contenu de PowerShell.

Exemple de copie de dossier basique

Utilisez la commande PowerShell de copie de dossier ci-dessous pour copier un dossier vers un autre emplacement. Cette commande de copie PowerShell copiera tous les fichiers dans le dossier « source » et les placera dans le dossier de destination.

      Copy-Item -Path "C:\source\folder" -Destination "D:\destination"
      

Copie de dossiers avec sous-dossiers

Et si le dossier source contenait plusieurs sous-dossiers ? En utilisant la commande de base ci-dessus, tout ce qui se trouve dans les sous-dossiers aurait été ignoré. Si vous souhaitez copier tout ce qui se trouve dans le dossier source, y compris le contenu des sous-dossiers, vous devez exécuter une commande de copie de dossier et de sous-dossiers PowerShell en utilisant le paramètre Recurse.

      Copy-Item -Path "C:\source\folder" -Destination "D:\destination" -Recurse
      

Copier et fusionner plusieurs dossiers

Supposons que vous souhaitiez copier les fichiers de deux dossiers sources et les fusionner dans un seul dossier de destination. Cela se fait facilement en utilisant la commande PowerShell pour copier le contenu d'un dossier dans un autre. Ici, deux chemins sources sont séparés par une virgule. Ils sont copiés puis fusionnés dans le dossier de destination.

      Copy-Item -Path "C:\source1\*","C:\source2\*" -Destination "D:\destination"
      

Techniques avancées de copie de fichiers et de dossiers

Utilisation de jokers dans les chemins de fichiers

Les caractères génériques vous permettent de copier plusieurs fichiers ou dossiers correspondant à un motif spécifique sans avoir à les énumérer individuellement. Ils sont idéaux pour traiter un grand nombre de fichiers ou de dossiers, car l'utilisation de caractères génériques peut considérablement réduire la quantité de code nécessaire. Dans l'exemple ci-dessous, le caractère générique est utilisé pour tout fichier .txt :

      Copy-Item -Path "C:\source\*.txt" -Destination "C:\Destination Two"
      

Voici à quoi cela ressemble en PowerShell :

Image

Filtrage des fichiers avec les paramètres Include et Exclude

Il y aura des moments où vous voudrez exclure certains fichiers spécifiques d'un dossier pour la copie. Vous pourriez vouloir exclure ou seulement inclure certains types de fichiers ou versions de fichiers, ou ne pas inclure des fichiers spécifiques contenant des informations sensibles. Ainsi, vous voudrez probablement exclure les fichiers temporaires ou non nécessaires pendant un processus de sauvegarde ou de migration.

Dans l'exemple ci-dessous, nous copions et spécifions que tous les fichiers journaux doivent être pris en compte pour la copie ; cependant, tout fichier journal ayant également une extension .tmp sera exclu.

      Copy-Item -Path "C:\source\*" -Destination "D:\destination" -Include "*.log" -Exclude "*.tmp"
      

Utilisation du paramètre Force pour écraser les fichiers

Par défaut, Copy-Item écrasera les fichiers existants à la destination sans demander de confirmation. Parfois, vous pourriez rencontrer une situation où le dossier de destination contient un fichier en lecture seule portant le même nom que le fichier que vous essayez de copier. Par défaut, Copy-Item n'écrasera pas ce fichier en lecture seule. Cependant, vous pouvez passer outre ce comportement et forcer l'écrasement en utilisant le paramètre -Force. Voici un exemple de son utilisation :

      Copy-Item -Path "C:\source\file.txt" -Destination "D:\destination" -Force
      

Copie de fichiers et de dossiers vers des ordinateurs distants via Copy-Item

Bien qu'il existe des situations où vous pourriez avoir besoin de copier des fichiers et des dossiers vers différents emplacements de lecteur sur un ordinateur local, la véritable force de la cmdlet Copy-Item réside dans sa capacité à faciliter le transfert de fichiers et de dossiers entre des ordinateurs distants.

Configuration d'une session à distance avec New-PSSession

Disons que vous souhaitez copier des fichiers vers un ordinateur distant en utilisant PowerShell. Bien que vous puissiez avoir des droits d'administrateur local, votre compte actuel peut ne pas avoir les droits appropriés sur l'ordinateur de destination. Vous devrez également connaître le nom de l'ordinateur distant. Dans ce cas, vous devez établir une session à distance avec le nouvel ordinateur en utilisant des informations d'identification alternatives. Vous pouvez mettre en œuvre la copie de fichier PowerShell vers un dossier en utilisant la commande $session ci-dessous.

      $session = New-PSSession -ComputerName "RemotePC" -Credential "User"
      

Copie de fichiers vers un ordinateur distant

Vous pouvez maintenant copier des fichiers vers l'ordinateur distant en utilisant la session établie.

      Copy-Item -Path "C:\source\file.txt" -Destination "C:\remote\destination" -ToSession $session
      

Copie de fichiers depuis un ordinateur distant

Bien sûr, vous pouvez vouloir copier des fichiers d'un ordinateur distant vers votre ordinateur local. Pour cela, utilisez la commande suivante.

      Copy-Item -Path "C:\remote\source\file.txt" -Destination "C:\local\destination" -FromSession $session
      

Copie récursive de dossiers distants

Dans les exemples précédents impliquant des ordinateurs distants, les sous-dossiers et leur contenu n'étaient pas inclus dans l'opération de copie. Pour inclure l'intégralité du contenu du chemin de l'élément source, y compris tous les sous-dossiers et fichiers, ajoutez le paramètre -Recurse à la commande Copy-Item, tout comme nous l'avons fait avec les opérations de copie locales.

      Copy-Item -Path "C:\remote\source\folder" -Destination "C:\local\destination" -FromSession $session -Recurse
      

Contenu connexe sélectionné :

Gestion des erreurs et vérification

Utilisation des paramètres WhatIf et Confirm

Le paramètre WhatIf vous permet de vérifier le résultat d'une commande sans apporter de modifications. Par exemple, comme illustré ci-dessous, vous pourriez vouloir confirmer que les chemins source et destination sont corrects avant d'exécuter l'opération de copie.

Image

Vous pouvez également vérifier le comportement d'écrasement, qui indique quels fichiers seront écrasés à la destination, vous aidant ainsi à éviter une perte de données non intentionnelle. WhatIf vous aide à comprendre exactement quels éléments seront copiés. Le paramètre de commande est indiqué ci-dessous.

      Copy-Item -Path "C:\Source\File1.txt" -Destination "C:\Destination Two" -WhatIf
      

Par défaut, la plupart des cmdlets PowerShell apportent des modifications au système sans confirmation de l'utilisateur. Il peut y avoir des cas où vous souhaitez que l'utilisateur confirme une action avant son exécution. Le meilleur exemple serait si vous utilisiez PowerShell pour supprimer un fichier. Dans l'exemple ci-dessous, vous utilisez la commande confirm pour demander confirmation à l'utilisateur.

      Remove-Item -Path C:\file.txt -Confirm
      

La commande sera exécutée dans PowerShell, comme indiqué ci-dessous :

Image

Vous pouvez ajouter le paramètre -Confirm à n'importe quelle commande Copy-Item.

Vérification du processus de copie

Lorsque vous utilisez PowerShell pour sauvegarder des fichiers critiques, vous pouvez vérifier que le processus de copie a eu lieu. Vous pouvez créer un script PowerShell simple, comme celui ci-dessous, pour confirmer la copie des fichiers en comparant les nombres de fichiers, les tailles et les horodatages.

      # Define source and destination paths
$source = "C:\SourceFolder"
$destination = "C:\DestinationFolder"
# Copy the files from source to destination
Copy-Item -Path $source\* -Destination $destination -Recurse
# Confirm the files were copied by checking if they exist in the destination folder
$sourceFiles = Get-ChildItem -Path $source
$allCopied = $true
foreach ($file in $sourceFiles) {
    $destinationFile = Join-Path $destination $file.Name
    if (Test-Path $destinationFile) {
        Write-Host "File '$($file.Name)' was copied successfully."
    } else {
        Write-Host "File '$($file.Name)' failed to copy."
        $allCopied = $false
    }
}
if ($allCopied) {
    Write-Host "All files copied successfully."
} else {
    Write-Host "Some files failed to copy."
}
      

Gestion des erreurs et des tentatives

Vous voudrez peut-être utiliser la gestion des erreurs pour la copie de gros fichiers afin de garantir que vos scripts fonctionnent correctement et peuvent se récupérer des échecs inattendus. Dans PowerShell, la principale méthode de gestion des erreurs est l'utilisation des blocs try-catch. Le script ci-dessous utilise le try-catch pour gérer les erreurs lors de la copie de fichiers

      # Define source and destination paths
$source = "C:\SourceFolder"
$destination = "C:\DestinationFolder"
# Function to copy files with error handling
function Copy-Files {
    try {
        # Copy files and set error action to stop failure
        Copy-Item -Path $source\* -Destination $destination -Recurse -ErrorAction Stop
        Write-Host "Files copied successfully."
    }
    catch {
        # Log the error message
        Write-Error "An error occurred while copying files: $($_.Exception.Message)"
        # Perform additional actions, like retrying or logging
    }
    finally {
        Write-Host "Copy operation complete."
    }
}
# Execute the function
Copy-Files

      

Exemples pratiques et cas d'utilisation de la cmdlet Copy-Item

Exemples détaillés de tâches courantes

  • Copie de fichiers depuis un disque dur en défaillance : Un disque dur présente des signes de défaillance, et les fichiers critiques doivent être copiés vers un emplacement sûr avant que le disque ne tombe en panne.
  • Automatisation de la sauvegarde pour les modifications quotidiennes de fichiers : Pour la reprise après sinistre, une entreprise pourrait avoir besoin de sauvegarder tous les fichiers d'un répertoire critique sur un serveur de sauvegarde.
  • Migration d'un serveur sur site vers le stockage dans le cloud : Une entreprise peut souhaiter migrer les documents de son serveur local des disques locaux vers un fournisseur de stockage dans le cloud tel que Azure ou AWS.
  • Déploiement de fichiers de configuration sur plusieurs serveurs : Un administrateur système souhaite déployer des fichiers de configuration mis à jour depuis C:\ConfigUpdates vers une liste de serveurs distants.

Scénarios et solutions du monde réel

Une structure de fichiers complexe peut présenter certains défis lors de l'utilisation de la cmdlet Copy-Item. Par exemple, les chemins de fichiers longs peuvent poser problème pour les anciennes versions de Windows qui ne prennent pas en charge les chemins de fichiers de plus de 260 caractères. Dans ces cas, vous pourriez préférer utiliser des chemins UNC plutôt que des chemins de fichiers locaux.

Il peut y avoir des cas où vous devez utiliser le paramètre -LiteralPath dans le cmdlet Copy-Item. Cela peut être nécessaire lorsque le chemin contient des caractères spéciaux (comme [, ], ou *) que PowerShell pourrait autrement interpréter comme des caractères génériques ou des séquences d'échappement.

Les problèmes de permission sont également un problème courant. Vous pouvez utiliser le paramètre -Force pour outrepasser certaines restrictions ou exécuter PowerShell en tant qu'administrateur.

Contenu connexe sélectionné :

Scripts d'exemple pour l'automatisation

Il est dans votre intérêt d'automatiser autant de tâches manuelles que possible pour les rationaliser et éviter les erreurs humaines. Voici un exemple de script PowerShell utilisé pour sauvegarder un dossier dans un répertoire de sauvegarde.

      # Define source and destination directories
$sourcePath = "C:\SourceDirectory"
$backupPath = "D:\BackupDirectory"
# Get current timestamp to append to the backup folder
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
# Create a new folder for the current backup with timestamp
$backupDestination = "$backupPath\Backup_$timestamp"
New-Item -ItemType Directory -Path $backupDestination
# Copy all files and directories from the source to the backup folder
try {
    Copy-Item -Path $sourcePath -Destination $backupDestination -Recurse -Force
    Write-Output "Backup completed successfully on $(Get-Date)"
} catch {
    Write-Output "An error occurred during the backup: $_"
}
# Optional: Clean up old backups (e.g., delete backups older than 30 days)
$daysToKeep = 30
$oldBackups = Get-ChildItem -Path $backupPath -Directory | Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$daysToKeep) }
foreach ($backup in $oldBackups) {
    try {
        Remove-Item -Path $backup.FullName -Recurse -Force
        Write-Output "Old backup removed: $($backup.FullName)"
    } catch {
        Write-Output "An error occurred while deleting old backups: $_"
    }
}
      

Conseils et meilleures pratiques

Meilleures pratiques pour utiliser Copy-Item

Bien que le cmdlet Copy-Item soit simple, voici quelques bonnes pratiques qui pourraient vous aider dans des circonstances plus complexes.

  • Exécutez PowerShell en tant qu'Administrateur
  • Utilisez le paramètre -Recurse pour copier des structures de répertoires entières.
  • Utilisez le paramètre -Force avec prudence pour éviter les écrasements non intentionnels
  • Lors de la copie de grands répertoires, envisagez des alternatives telles que Robocopy ou d'autres outils mieux adaptés pour les gros travaux.
  • Envisagez d'utiliser -WhatIf pour tester vos commandes afin de voir ce qui pourrait se passer sans apporter de modifications réelles.

Pièges courants et comment les éviter

En plus des meilleures pratiques, vous devriez également prendre en compte ces pièges courants lors de l'utilisation de scripts PowerShell :

  • Évitez d'utiliser des chemins incorrects ou relatifs qui ne se résolvent pas comme prévu en utilisant des chemins complets
  • Il est facile d'oublier les sous-répertoires sous-jacents, alors utilisez le paramètre -Recurse pour vous assurer que tous les fichiers contenus dans le répertoire parent sont copiés.
  • Des autorisations insuffisantes vous empêcheront de réaliser des opérations de copie, en particulier lorsque des machines distantes sont impliquées. Assurez-vous d'avoir les permissions appropriées et utilisez des privilèges élevés lorsque nécessaire.
  • Lorsque les opérations de copie complexes ne sont pas correctement terminées, utilisez des blocs try-catch et mettez en œuvre une journalisation des erreurs appropriée.

Considérations et optimisations de performance

La copie de jeux de données importants peut consommer beaucoup de puissance de traitement sur votre ordinateur. Le traitement parallèle est une technique informatique qui consiste à décomposer une tâche en parties plus petites et à les exécuter simultanément sur plusieurs processeurs ou cœurs. Le traitement parallèle peut considérablement améliorer les performances lorsqu'il est appliqué à des opérations de fichiers comme celles effectuées par le cmdlet Copy-Item. Au lieu de copier les fichiers un par un séquentiellement, le traitement parallèle permet de copier plusieurs fichiers en même temps, en utilisant la capacité totale des processeurs multicœurs modernes. Cette approche peut réduire considérablement le temps nécessaire pour de grandes opérations de copie, car elle tire parti des ressources système disponibles plus efficacement. Bien que le cmdlet Copy-Item ne prenne pas en charge nativement le traitement parallèle, PowerShell fournit des mécanismes comme ForEach-Object -Parallel qui peuvent être utilisés avec Copy-Item pour réaliser la copie de fichiers en parallèle. Cela peut potentiellement offrir des gains de performance substantiels dans des scénarios impliquant de nombreux fichiers ou des hiérarchies de répertoires complexes. Un exemple de base est montré ci-dessous :

      <$sourcePath = "C:\SourceFolder"
$destPath = "D:\DestinationFolder"
Get-ChildItem $sourcePath | ForEach-Object -Parallel {
    Copy-Item $_.FullName -Destination $using:destPath -Force
} -ThrottleLimit 8
      

Conclusion

La commande cmdlet Copy-Item est un outil polyvalent dans PowerShell pour la gestion des fichiers et des opérations de répertoire. Elle dispose d'une variété de paramètres pour couvrir de multiples situations, telles que la capacité de spécifier un chemin d'élément de copie et de mettre en œuvre la gestion des erreurs. Que vous utilisiez un script PowerShell pour copier des fichiers de la source à la destination ou pour copier des fichiers localement ou à travers des systèmes distants, la cmdlet Copy-Item peut effectuer des fonctions de copie essentielles de manière efficace. Envisagez de mettre en œuvre un traitement parallèle pour améliorer les performances pour les ensembles de données volumineux et complexes ou explorez des outils spécialisés conçus pour la gestion des transferts de données étendus. Maîtriser la cmdlet Copy-Item assure des transferts de fichiers précis, ce qui en fait un composant essentiel de la boîte à outils de tout utilisateur de PowerShell, tandis que comprendre ses limitations permet de prendre des décisions éclairées sur quand employer des méthodes alternatives.

Partager sur

En savoir plus

À propos de l'auteur

Asset Not Found

Kevin Horvatin

Architecte logiciel principal

Kevin Horvatin est Lead Software Architect chez Netwrix et responsable de Netwrix Privilege Secure. Développeur de logiciels depuis plus de 20 ans, il travaille avec PowerShell et C# depuis leur introduction.