Wie kann ich ein Verzeichnis kopieren und seinen Inhalt überschreiben, wenn es mit Powershell vorhanden ist?

9

Ich habe eine Verzeichnisquelle mit einigen Dateien darin, die ich in einen Ordner Ziel kopieren möchte. Das Ziel ist möglicherweise vorhanden und enthält möglicherweise bereits Dateien. Alle Dateien mit demselben Namen wie die in Source sollten überschrieben werden.

Wenn ich das in Powershell laufen lasse:

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

Dann erstellt die erste Zeile den Ordner .\Destinationund kopiert .\Sourceihn, was ich beim nächsten Mal wiederholen möchte. Die zweite Zeile wird jedoch stattdessen .\Sourcein den neuen .\DestinationOrdner kopiert (erstellt .\Destination\Source), und die dritte Zeile wird .\Destination\Sourceerneut überschrieben .

Wie kann ich dafür sorgen, dass es sich die ganze Zeit wie im ersten Fall verhält? Das heißt, überschreiben .\Destinationstatt kopieren?

Douglas
quelle
Könntest Du das erläutern? Sie möchten den Inhalt von "Quelle" in "Ziel" kopieren? und nicht den Ordner "Quelle" in "Ziel" kopieren?
BroScience
Ja das ist richtig. Der "Ziel" -Ordner ist möglicherweise nicht vorhanden, daher möchte ich, dass er erstellt wird, wenn er nicht beendet wird.
Douglas
Es kann sich lohnen, eine Roboterkopie als Alternative in Betracht zu ziehen . Sie können es immer noch von Powershell aus aufrufen, wenn Sie müssen. Es wird das if existsProblem leicht lösen und erfordert nicht, dass Sie Ihr Ziel zwangsweise rekursiv löschen, was mit seinen eigenen Gefahren verbunden ist.
Jeremy
Eng verwandte SO-Frage: stackoverflow.com/q/47964451/45375
mklement0

Antworten:

7

Das Problem ist also das

cp -r -fo foo bar

funktioniert nur wenn barnicht existiert und

cp -r -fo foo/* bar

funktioniert nur wenn barvorhanden. Um dies zu umgehen, müssen Sie sicherstellen, dass bares etwas gibt, bevor Sie etwas unternehmen

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

Wenn Sie nur Inhalte des "Quell" -Ordners kopieren möchten, verwenden Sie

copy-item .\source\* .\destination -force -recurse
BroScience
quelle
1
Dies funktioniert nur, wenn destinationbereits vorhanden.
Steven Penny
3

Die Antwort von Steven Penny https://superuser.com/a/742719/126444 löscht nicht den ursprünglichen Inhalt des Zielverzeichnisses, sondern hängt ihn nur an. Ich musste den Zielordner vollständig durch den Inhalt der Quelle ersetzen und 2 Funktionen erstellen:

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
quelle
1

Angenommen, Sie haben die folgende Verzeichnisstruktur

  • Wurzel

    • Ordner_a
      • a.txt
      • b.txt
      • c.txt
    • Ordner_b
      • a.txt
      • b.txt

    Im Stammordner können Sie die gewünschten Ergebnisse mit der folgenden Befehlsfolge erzielen:

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

Es wird nur c.txt kopiert

kb_sou
quelle