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?


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

3

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

copy-item .\source\* .\destination -force -recurse

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
}

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.