Jak mogę skopiować katalog, zastępując jego zawartość, jeśli istnieje on za pomocą Powershell?

9

Mam źródło katalogu z niektórymi plikami, które chciałbym skopiować do folderu docelowego. Miejsce docelowe może istnieć i może już zawierać pliki. Wszelkie pliki o takich samych nazwach jak pliki źródłowe powinny zostać zastąpione.

Jeśli uruchomię to w Powershell:

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

Następnie pierwszy wiersz tworzy folder .\Destinationi kopiuje .\Sourcedo niego, co chciałbym powtórzyć następnym razem. Jednak zamiast tego drugi wiersz jest kopiowany .\Sourcedo nowego .\Destinationfolderu (tworzenie .\Destination\Source), a następnie trzeci wiersz jest .\Destination\Sourceponownie nadpisywany .

Jak mogę sprawić, żeby cały czas działał tak jak w pierwszym przypadku? To znaczy, zastąpić .\Destinationzamiast kopiować do niego?

Douglas
źródło
Możesz wyjaśnić? chcesz skopiować zawartość „źródła” do „miejsca docelowego”? i nie kopiujesz folderu „source” do „destination”?
BroScience
Tak, to jest poprawne. Folder „docelowy” może nie istnieć, więc chcę go utworzyć, jeśli nie zostanie zamknięty.
Douglas,
Warto rozważyć robocopy jako alternatywę. Jeśli chcesz, możesz nadal wywoływać go z PowerShell. Z if existsłatwością poradzi sobie z tym problemem i nie będzie wymagać wymuszonego rekurencyjnego usuwania miejsca docelowego, co wiąże się z własnymi zagrożeniami.
Jeremy
Ściśle powiązane pytanie SO: stackoverflow.com/q/47964451/45375
mklement0

Odpowiedzi:

7

Problem w tym, że

cp -r -fo foo bar

działa tylko, jeśli barnie istnieje i

cp -r -fo foo/* bar

działa tylko, jeśli baristnieje. Aby obejść ten problem, musisz upewnić się, że baristnieje, zanim cokolwiek zrobisz

md -f bar
cp -r -fo foo/* bar
Steven Penny
źródło
3

Jeśli chcesz tylko skopiować zawartość folderu „źródłowego” użyj

copy-item .\source\* .\destination -force -recurse
BroScience
źródło
1
Działa to tylko wtedy, gdy destinationjuż istnieje.
Steven Penny
3

Odpowiedź Stevena Penny'ego https://superuser.com/a/742719/126444 nie usuwa oryginalnej zawartości katalogu docelowego, a jedynie dołącza się do niego. Musiałem całkowicie zastąpić folder docelowy zawartością źródła i utworzyłem 2 funkcje:

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
źródło
1

Powiedzmy, że masz następującą strukturę katalogów

  • korzeń

    • folder_a
      • a.txt
      • b.txt
      • c.txt
    • folder_b
      • a.txt
      • b.txt

    W folderze głównym możesz osiągnąć pożądane wyniki, wykonując następującą sekwencję poleceń:

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

Zostanie skopiowany tylko plik c.txt

kb_sou
źródło