53 votes

Comment utiliser PowerShell copy-item et garder la structure

J'ai une structure de répertoire qui ressemble à ceci :

C:\folderA\folderB\folderC\client1\f1\files
C:\folderA\folderB\folderC\client1\f2\files
C:\folderA\folderB\folderC\client2\f1\files
C:\folderA\folderB\folderC\client2\f2\files
C:\folderA\folderB\folderC\client3\f1\files
C:\folderA\folderB\folderC\client4\f2\files

Je veux copier le contenu du f1 dossiers dans C:\tmp\ pour obtenir ce

C:\tmp\client1\f1\files
C:\tmp\client2\f1\files
C:\tmp\client3\f1\files

J'ai essayé ça :

Copy-Item -recur -path: "*/f1/" -destination: C:\tmp\

Mais il copie le contenu sans copier correctement la structure.

47voto

Thomas M Points 547

Dans PowerShell version 3.0 et plus récente, cela se fait simplement de cette façon :

Get-ChildItem -Path $sourceDir | Copy-Item -Destination $targetDir -Recurse -Container

Référence : Get-ChildItem

24voto

Sentient Points 873

PowerShell :

$sourceDir = 'c:\folderA\folderB\folderC\client1\f1'
$targetDir = ' c:\tmp\'

Get-ChildItem $sourceDir -filter "*" -recurse | `
    foreach{
        $targetFile = $targetDir + $_.FullName.SubString($sourceDir.Length);
        New-Item -ItemType File -Path $targetFile -Force;
        Copy-Item $_.FullName -destination $targetFile
    }

Note :

  • Le filtre "*" ne fait rien. Il est juste là pour illustrer le fait que vous voulez copier certains fichiers spécifiques. Par exemple, tous les fichiers *.config.
  • Il faut toujours appeler un Nouvel élément con -Force pour créer réellement la structure du dossier.

16voto

workabyte Points 779

J'ai fait des recherches et j'ai trouvé de nombreuses solutions à ce problème, toutes nécessitant une modification, et pas seulement une simple commande de copie d'article. Il est vrai que certaines de ces questions datent d'avant PowerShell 3.0 et que les réponses ne sont donc pas fausses, mais en utilisant PowerShell 3.0, j'ai finalement pu accomplir cette tâche en utilisant la commande -Container le commutateur pour Copy-Item :

Copy-Item $from $to -Recurse -Container

C'est le test que j'ai effectué, aucune erreur et le dossier de destination représentait la même structure de dossiers :

New-Item -ItemType dir -Name test_copy
New-Item -ItemType dir -Name test_copy\folder1
New-Item -ItemType file -Name test_copy\folder1\test.txt

# NOTE: with no \ at the end of the destination, the file
#       is created in the root of the destination, and
#       it does not create the folder1 container
#Copy-Item D:\tmp\test_copy\* D:\tmp\test_copy2 -Recurse -Container

# If the destination does not exist, this created the
# matching folder structure and file with no errors
Copy-Item D:\tmp\test_copy\* D:\tmp\test_copy2\ -Recurse -Container

12voto

Joey Points 148544

Utilice xcopy o robocopy qui ont tous deux été conçus exactement dans ce but. En supposant que vos chemins sont uniquement des chemins de système de fichiers, bien sûr.

7voto

Adam Caviness Points 971

Si vous souhaitez copier correctement une structure de dossier avec PowerShell, procédez comme suit :

$sourceDir = 'C:\source_directory'
$targetDir = 'C:\target_directory'

Get-ChildItem $sourceDir -Recurse | % {
   $dest = $targetDir + $_.FullName.SubString($sourceDir.Length)

   If (!($dest.Contains('.')) -and !(Test-Path $dest))
   {
        mkdir $dest
   }

   Copy-Item $_.FullName -Destination $dest -Force
}

Cela tient compte de la création de répertoires et de la simple copie des fichiers. Bien sûr, vous devrez modifier l'appel Contains() ci-dessus si vos dossiers contiennent des points ou ajouter un filtre si vous voulez rechercher "f1" comme vous l'avez mentionné.

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