Как я могу скопировать каталог, переписав его содержимое, если оно существует с помощью Powershell?

9

У меня есть каталог Source с некоторыми файлами, которые я хотел бы скопировать в папку Destination. Адресат может существовать, и в нем уже могут быть файлы. Любые файлы с тем же именем, что и в Source, должны быть перезаписаны.

Если я запускаю это в Powershell:

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

Затем первая строка создает папку .\Destinationи копирует .\Sourceв нее, что я хотел бы повторить в следующий раз. Однако вторая строка копирует .\Sourceв новую .\Destinationпапку (создает .\Destination\Source), а затем третья строка перезаписывается .\Destination\Sourceснова.

Как я могу заставить его действовать как в первом случае все время? То есть переписать .\Destinationвместо копирования в него?

Дуглас
источник
Вы можете уточнить? Вы хотите скопировать содержимое «источника» в «место назначения»? а не копировать папку «источник» в «место назначения»?
BroScience
Да, это правильно. Папка «destination» может не существовать, поэтому я хочу, чтобы она создавалась, если она не закрывается.
Дуглас
Возможно, стоит рассмотреть робокопию в качестве альтернативы. Вы все еще можете позвонить из powershell, если вам нужно. Он if existsлегко решит проблему и не потребует от вас принудительно рекурсивного удаления пункта назначения, что сопряжено со своими собственными опасностями.
Джереми
Тесно связанный вопрос SO: stackoverflow.com/q/47964451/45375
mklement0

Ответы:

7

Так что проблема в том, что

cp -r -fo foo bar

работает только если barне существует и

cp -r -fo foo/* bar

работает только если barсуществует. Таким образом, чтобы обойти, вы должны убедиться, что barсуществует, прежде чем делать что-либо

md -f bar
cp -r -fo foo/* bar
Стивен Пенни
источник
3

Если вы хотите скопировать только содержимое папки «source», используйте

copy-item .\source\* .\destination -force -recurse
BroScience
источник
1
Это работает только если destinationуже существует.
Стивен Пенни
3

Ответ Стивена Пенни https://superuser.com/a/742719/126444 не удаляет исходное содержимое целевого каталога, а просто добавляет к нему. Мне нужно было полностью заменить целевую папку с содержимым источника и создал 2 функции:

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

Допустим, у вас есть следующая структура каталогов

  • корень

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

    В корневой папке вы можете достичь желаемых результатов с помощью следующей последовательности команд:

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

Только c.txt будет скопирован

kb_sou
источник