Як я можу скопіювати каталог, перезаписавши його вміст, якщо він існує за допомогою Powershell?


9

У мене є джерело каталогу з деякими файлами в ньому, які я хотів би скопіювати у папку 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замість того, щоб копіювати в нього?


Ви можете уточнити? ви хочете скопіювати вміст "source" у "призначення"? а не скопіювати папку "source" у "призначення"?
BroScience

Так, це правильно. Папка "призначення" може не існувати, тому я хочу, щоб вона була створена, якщо вона не вийде.
Дуглас

Можливо, варто розглянути роботокопію як альтернативу. Ви все ще можете зателефонувати до нього з Powerhell, якщо вам потрібно. Він 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

Якщо ви хочете скопіювати лише вміст папки "джерело", використовуйте

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

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

Скажімо, у вас є така структура Каталогів

  • корінь

    • папка_а
      • a.txt
      • b.txt
      • c.txt
    • папка_b
      • a.txt
      • b.txt

    У кореневій папці ви можете досягти бажаних результатів за допомогою наступної послідовності команд:

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

Буде скопійовано лише c.txt

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.