¿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?


¿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

3

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

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

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
}

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.