Como posso copiar um diretório, sobrescrevendo seu conteúdo se ele existir usando o Powershell?

7

Eu tenho um diretório Source com alguns arquivos, que eu gostaria de copiar para uma pasta Destination. O destino pode existir e já pode ter arquivos nele. Todos os arquivos com o mesmo nome que os do Source devem ser sobrescritos.

Se eu executar isso no Powershell:

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

A primeira linha cria a pasta .\Destination e copia .\Source , que é o que eu gostaria de repetir na próxima vez. No entanto, a segunda linha copia .\Source para a nova pasta .\Destination (criando .\Destination\Source ), em seguida, a terceira linha sobrescreve .\Destination\Source novamente.

Como posso fazê-lo agir como no primeiro caso o tempo todo? Isto é, sobrescreva .\Destination em vez de copiar para ele?

    
por Douglas 31.01.2013 / 15:58

4 respostas

6

Então, o problema é que

cp -r -fo foo bar

só funciona se bar não existir e

cp -r -fo foo/* bar

só funciona se bar existir. Então, para contornar, você precisa ter certeza de que bar existe antes de fazer qualquer coisa

md -f bar
cp -r -fo foo/* bar
    
por 17.04.2014 / 02:05
3

Se você quiser apenas copiar o conteúdo da pasta "source" use

copy-item .\source\* .\destination -force -recurse
    
por 31.01.2013 / 18:29
3

A resposta de Steven Penny link não exclui o conteúdo original do diretório de destino, apenas anexando a ele. Eu precisava substituir completamente a pasta de destino com o conteúdo da fonte e criei duas funções:

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
}
    
por 05.02.2016 / 00:32
1

Digamos que você tenha a seguinte estrutura de diretórios

  • raiz

    • pasta_a
      • a.txt
      • b.txt
      • c.txt
    • pasta_b
      • a.txt
      • b.txt

    Na pasta raiz, você pode obter os resultados desejados pela seguinte seqüência de comandos:

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

Apenas c.txt será copiado

    
por 31.01.2013 / 16:27