69 votes

Copy-Item doit-il créer la structure du répertoire de destination ?

J'essaie de copier un fichier vers un nouvel emplacement, en conservant la structure des répertoires.

 $source = "c:\some\path\to\a\file.txt"
destination = "c:\a\more\different\path\to\the\file.txt"

Copy-Item  $source $destination -Force -Recurse

Mais j'obtiens un DirectoryNotFoundException :

 Copy-Item : Could not find a part of the path 'c:\a\more\different\path\to\the\file.txt'

136voto

ajk Points 1878

L' -recurse ne crée une structure de dossier de destination que si la source est un répertoire. Lorsque la source est un fichier, Copy-Item s'attend à ce que la destination soit un fichier ou un répertoire qui existe déjà. Voici quelques façons de contourner ce problème.

Option 1 : Copier des répertoires au lieu de fichiers

 $source = "c:\some\path\to\a\dir"; $destination = "c:\a\different\dir"
# No -force is required here, -recurse alone will do
Copy-Item $source $destination -Recurse

Option 2 : « Touchez » d'abord le fichier, puis écrasez-le

 $source = "c:\some\path\to\a\file.txt"; $destination = "c:\a\different\file.txt"
# Create the folder structure and empty destination file, similar to
# the Unix 'touch' command
New-Item -ItemType File -Path $destination -Force
Copy-Item $source $destination -Force

20voto

Mike Points 767

Alternativement, à partir de la PS3.0, vous pouvez simplement utiliser le New-Item pour créer directement le dossier cible, sans avoir à créer un fichier "factice", par exemple ...

 New-Item -Type dir \\target\1\2\3\4\5

... créera avec plaisir la structure \\target\1\2\3\4\5 quelle que soit la quantité déjà existante.

10voto

Lopez Points 91

Voici un oneliner pour le faire. Split-Path récupère le dossier parent, New-Item crée, puis Copy-Item copie le fichier. Veuillez noter que le fichier de destination aura le même nom de fichier que le fichier source. De plus, cela ne fonctionnera pas si vous devez copier plusieurs fichiers dans le même dossier car avec le deuxième fichier, vous obtiendrez une erreur An item with the specified name <destination direcory name> already exists

 Copy-Item $source -Destination (New-Item -Path (Split-Path -Path $destination) -Type Directory)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X