¿Cómo puedo copiar un directorio, sobrescribiendo su contenido si existe usando Powershell?

9

Tengo un directorio de origen con algunos archivos, que me gustaría copiar a una carpeta de destino. El destino puede existir y puede que ya tenga archivos. Todos los archivos con el mismo nombre que los de Source deben sobrescribirse.

Si ejecuto esto en Powershell:

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

Luego, la primera línea crea la carpeta .\Destinationy la copia .\Source, que es lo que me gustaría repetir la próxima vez. Sin embargo, la segunda línea se copia .\Sourceen la nueva .\Destinationcarpeta (creación .\Destination\Source), luego la tercera línea se sobrescribe .\Destination\Sourcenuevamente.

¿Cómo puedo hacer que actúe como en el primer caso todo el tiempo? Es decir, ¿sobrescribir en .\Destinationlugar de copiar en él?

Douglas
fuente
¿Puedes aclarar? desea copiar el contenido de "fuente" en "destino"? y no copiar la carpeta "fuente" en "destino"?
BroScience
Si eso es correcto. Es posible que la carpeta "destino" no exista, por lo que quiero que se cree si no sale.
Douglas el
Puede valer la pena considerar la robocopia como alternativa. Todavía puede llamarlo desde powershell si lo necesita. Manejará el if existsproblema fácilmente y no requerirá que elimine su destino de manera recursiva de manera forzada, lo que conlleva sus propios peligros.
Jeremy
Pregunta SO estrechamente relacionada: stackoverflow.com/q/47964451/45375
mklement0

Respuestas:

7

Entonces el problema es que

cp -r -fo foo bar

solo funciona si barno existe y

cp -r -fo foo/* bar

solo funciona si barexiste. Para evitarlo, debe asegurarse de que barexista antes de hacer algo

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

Si solo desea copiar el contenido de la carpeta "fuente", use

copy-item .\source\* .\destination -force -recurse
BroScience
fuente
1
Esto solo funciona si destinationya existe.
Steven Penny
3

La respuesta de Steven Penny https://superuser.com/a/742719/126444 no elimina el contenido original del directorio de destino, solo lo agrega. Necesitaba reemplazar completamente la carpeta de destino con el contenido de la fuente y creé 2 funciones:

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
fuente
1

Digamos que tiene la siguiente estructura de directorios

  • raíz

    • carpeta_a
      • a.txt
      • b.txt
      • c.txt
    • carpeta_b
      • a.txt
      • b.txt

    En La carpeta raíz puede lograr los resultados que desea mediante la siguiente secuencia de comandos:

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

Solo se copiará c.txt

kb_sou
fuente