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

9

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. Quaisquer arquivos com o mesmo nome que os do Source devem ser substituídos.

Se eu executar isso no Powershell:

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

Em seguida, a primeira linha cria a pasta .\Destinatione copia .\Sourcenela, que é o que eu gostaria de repetir para a próxima vez. No entanto, a segunda linha copia .\Sourcepara a nova .\Destinationpasta (criando .\Destination\Source) e a terceira linha sobrescreve .\Destination\Sourcenovamente.

Como posso fazê-lo agir como no primeiro caso o tempo todo? Ou seja, substituir em .\Destinationvez de copiar para ele?

Douglas
fonte
Você pode esclarecer? você deseja copiar o conteúdo de "origem" para "destino"? e não copiar a pasta "origem" para "destino"?
BroScience
Sim esta correto. A pasta "destination" pode não existir, então eu quero que ela seja criada se não sair.
Douglas
Pode valer a pena considerar a robocópia como uma alternativa. Você ainda pode chamá-lo de PowerShell, se precisar. Ele resolverá o if existsproblema facilmente e não exigirá que você exclua recursivamente o seu destino com força, o que traz seus próprios perigos.
23418 Jeremy
Questão tão intimamente relacionados: stackoverflow.com/q/47964451/45375
mklement0

Respostas:

7

Então o problema é que

cp -r -fo foo bar

só funciona se barnão existir e

cp -r -fo foo/* bar

só funciona se barexistir. Portanto, para contornar o problema, você precisa garantir que barexista antes de fazer qualquer coisa

md -f bar
cp -r -fo foo/* bar
Steven Penny
fonte
3

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

copy-item .\source\* .\destination -force -recurse
BroScience
fonte
11
Isso funciona apenas se destinationjá existir.
Steven Penny
3

A resposta de Steven Penny https://superuser.com/a/742719/126444 não exclui o conteúdo original do diretório de destino, apenas o anexa. Eu precisava substituir completamente a pasta de destino pelo conteúdo da fonte e criei 2 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
}
Michael Freidgeim
fonte
1

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

  • raiz

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

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

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

Apenas c.txt será copiado

kb_sou
fonte