Comment puis-je copier un répertoire, écraser son contenu s'il existe à l'aide de Powershell?

9

J'ai un répertoire Source avec quelques fichiers, que je voudrais copier dans un dossier Destination. La destination peut exister et elle peut déjà contenir des fichiers. Tous les fichiers portant le même nom que ceux de Source doivent être remplacés.

Si je lance ceci dans Powershell:

Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse

Ensuite, la première ligne crée le dossier .\Destinationet y copie .\Source, ce que j'aimerais répéter pour la prochaine fois. Cependant, la deuxième ligne copie .\Sourceà la place dans le nouveau .\Destinationdossier (création .\Destination\Source), puis la troisième ligne écrase à .\Destination\Sourcenouveau.

Comment puis-je le faire agir comme dans le premier cas tout le temps? Autrement dit, écraser .\Destinationau lieu de le copier?

Douglas
la source
Pouvez-vous clarifier? vous voulez copier le contenu de "source" dans "destination"? et ne pas copier le dossier "source" dans "destination"?
BroScience
Oui c'est correct. Le dossier "destination" peut ne pas exister, je souhaite donc qu'il soit créé s'il ne se ferme pas.
Douglas
Il peut être utile d'envisager la robocopie comme alternative. Vous pouvez toujours l'appeler à partir de PowerShell si vous en avez besoin. Il gérera le if existsproblème facilement et ne vous obligera pas à supprimer de manière récursive votre destination non plus, ce qui présente ses propres dangers.
Jeremy
Question SO étroitement liée: stackoverflow.com/q/47964451/45375
mklement0

Réponses:

7

Le problème est que

cp -r -fo foo bar

ne fonctionne que s'il barn'existe pas et

cp -r -fo foo/* bar

ne fonctionne que s'il barexiste. Donc, pour contourner, vous devez vous assurer qu'il barexiste avant de faire quoi que ce soit

md -f bar
cp -r -fo foo/* bar
Steven Penny
la source
3

Si vous souhaitez uniquement copier le contenu du dossier "source", utilisez

copy-item .\source\* .\destination -force -recurse
BroScience
la source
1
Cela ne fonctionne que s'il destinationexiste déjà.
Steven Penny
3

La réponse de Steven Penny https://superuser.com/a/742719/126444 ne supprime pas le contenu original du répertoire cible, juste en y ajoutant. J'avais besoin de remplacer complètement le dossier cible par le contenu de la source et j'ai créé 2 fonctions:

function CopyToEmptyFolder($source, $target )
{
    DeleteIfExistsAndCreateEmptyFolder($target )
    Copy-Item $source\* $target -recurse -force
}
function DeleteIfExistsAndCreateEmptyFolder($dir )
{
    if ( Test-Path $dir ) {
    #http://stackoverflow.com/questions/7909167/how-to-quietly-remove-a-directory-with-content-in-powershell/9012108#9012108
           Get-ChildItem -Path  $dir -Force -Recurse | Remove-Item -force -recurse
           Remove-Item $dir -Force

    }
    New-Item -ItemType Directory -Force -Path $dir
}
Michael Freidgeim
la source
1

Disons que vous avez la structure de répertoires suivante

  • racine

    • folder_a
      • a.txt
      • b.txt
      • c.txt
    • dossier_b
      • a.txt
      • b.txt

    Dans le dossier racine, vous pouvez obtenir les résultats souhaités par la séquence de commandes suivante:

    $files = gci ./folder_b -name
    cp ./folder_a/*.txt -Exclude $files ./folder_b

Seul c.txt sera copié

kb_sou
la source