Script de copiado rápido en Windows

Hoy vamos a ver como hacer un script de copiado rápido de archivos para Windows. Es algo que me es muy útil para llevar una copia de mis trabajos en el pendrive. La forma sencilla sería hacer un copiado total al pendrive como lo haríamos desde el explorador gráfico pero desde consola:

Source   
  1. xcopy  /e "D:\mi_carpeta_origen" "E:\mi_carpeta_destino"

¿Que pasaría si lo dejásemos así? Pues que si manejamos muchos ficheros la operación de copiado eternizarse y esperar delante de una pantalla negra viendo como se copian nuestros datos no es uno de mis tres hobbys favoritos. Por eso vamos a agilizar la copia añadiendo más parámetros. El parámetro más interesante es el “/d” que hace que sólo se copien los archivos que se han modificado. Esto lo hace mediante la fecha de modificación, por lo que un archivo que no hayas modificado lo omitirá y pasará al siguiente, con lo que el tiempo de copia se reduce drásticamente. Antes no lo he dicho, pero “/e” es para que copie subdirectorios. También añadiremos el parámetro “/y“, que omite el diálogo de “Desea sobrescribir…” diciendo que sí a todo por defecto. El comando quedaría de la siguiente forma:

Source   
  1. xcopy  /e /y /d "D:\mi_carpeta_origen" "E:\mi_carpeta_destino"

¿Sencillo no? ¿Pero que pasaría si queremos realizar la copia del pendrive y se nos ha olvidado conectarlo? Pues que tendremos un bonito mensaje de error diciendo: “La unidad especificada no es válida“. Pues la solución está en usar un “if” con unos “goto” como se puede ver a continuación:

Source   
  1. @echo off
  2. if exist D:\ goto copia
  3. echo Pendrive no encontrado
  4. goto exit
  5. :copia
  6. echo Copiando al escritorio...
  7. xcopy /e /d /y "D:\mi_carpeta_origen" "E:\mi_carpeta_destino"
  8. echo Copiando al Dropbox...
  9. xcopy /e /d /y "D:\mi_carpeta_origen" "C:\Users\Diego\Desktop\Dropbox\copias\copia_pen"
  10. :exit
  11. echo Fin del script
  12. pause > nul

Analicemos el código:

  • @echo off se usa para evitar que salgan los comandos que hemos escrito. Solamente mejora la presentación.
  • if exist D:\ goto copiapen hace que si existe la unidad D: salte a la etiqueta :copia
  • echo nos sirve para mostrar mensajes por pantalla.
  • pause > nul redirecciona el mensaje “Presione una tecla para continuar a nul“, por lo que no se muestra en pantalla.
  • Además hemos añadido otra línea al xcopy para copiar los archivos al dropbox.

Después de hacer todo esto me surgió otro problema (¡Sorpresa! ¡Problemas en la informática! ¿Como es eso?): que pasa si tenemos otro pendrive y la letra cambia? Pues como somos unos maestros de la informática vamos a solucionarlo. La primera solución que se me ocurrió fue que cuando compruebe si existe la unidad D: buscara la carpeta, pero me parecía complicar las cosas demasiado para una tarea tan sencilla. ¿La forma sencilla? Asignarle una letra fija al pendrive: Botón derecho en equipo > Administrar > Administración de discos > Botón derecho en el pendrive > Cambiar letra y rutas de acceso de unidad… > y ahí le asignamos la que queramos. En mi caso voy a utilizar la L.

¿Y como podríamos mejorar todavía más este script? Pues una cosa que me resultaba muy útil era tener copias de seguridad completas para que en caso de que un fichero lo haya sobrescrito o que halla quedado corrupto poder volver atrás y recuperarlo. Para crear nuestra “máquina del tiempo” descargamos el 7-Zip de su web oficial y actualizamos nuestro código (ojo con la ruta de instalación del 7-zip):

Source   
  1. :: Requiere 7z.exe
  2. @echo off
  3. if exist L:\ goto copia
  4. color c
  5. echo Pendrive no encontrado
  6. goto exit
  7. :copia
  8. color A
  9. echo Alteza, sus archivos se estan copiando al escritorio...
  10. xcopy /e /d /y "L:\mi_carpeta_origen" "C:\mi_carpeta_destino"
  11. echo.
  12. echo Excelencia, estoy copiando sus ficheros al Dropbox...
  13. xcopy /e /d /y "L:\mi_carpeta_origen" "C:\Users\Diego\Desktop\Dropbox\copias\copia_pen"
  14. echo.
  15. :compresion
  16. set /p comprimir=Amo, desea que cree un fichero comprimido para usted? [s/n]
  17. echo.
  18. if %comprimir%==s (
  19. echo Me pondre a ello enseguida, maestro!
  20. echo.
  21. echo Comprimiendo...
  22. "C:\Program Files\7-Zip\7z" a -t7z -m0=lzma -mx=9 "D:\copias\7z_daw1\daw1_%date:~6,4%%date:~3,2%%date:~0,2%.7z" "L:\mi_carpeta_origen"
  23. echo.
  24. echo Fichero comprimido creado, que tenga usted un buen dia majestad!
  25. ) else (
  26. if %comprimir%==n (
  27. color e
  28. echo Sin copia pues, adios oh todopoderoso!
  29. ) else (
  30. echo Disculpe la ignorancia de un humilde servidor, pero no le he comprendido.
  31. goto compresion
  32. )
  33. )
  34. echo.
  35. :exit
  36. pause > nul

La línea de la compresión es: “C:\Program Files\7-Zip\7z” a -t7z -m0=lzma -mx=9 “D:\copias\7z_daw1\daw1_%date:~6,4%%date:~3,2%%date:~0,2%.7z” “L:\mi_carpeta_origen”. Explicación: “C:\Program Files\7-Zip\7z” es la ruta del archivo 7z.exe, con a -t7z le decimos que lo queremos en formato .7z, -m0=lzma para modo de compresión lzma, -mx=9 para decirle que utilize la máxima compresión, y “D:\copias\7z_daw1\copia_%date:~6,4%%date:~3,2%%date:~0,2%.7z” indica donde y con que nombre queremos guardar nuestro archivo comprimido, lo interesante es que le añade la fecha al nombre de modo que un fichero creado hoy 19 de noviembre de 2012 lo sería copia_20121119.7z. Se pone primero el año, luego el mes y luego el día para poder ordenarlo por nombre y así tenerlos de más nuevos a más viejos. “L:\mi_carpeta_origen” como su nombre indica es la carpeta de origen a comprimir. Debido a un mini-problema sin solucionar lo cojo desde el pendrive y no desde el disco duro que debería ser más rápido. (La explicación del mini-problema está al final). El resto de las cosas nuevas que he añadido son:

  • :: Requiere 7z.exe: es un comentario. Me sirve para acordarme de instalar el 7-zip cuando formatee.
  • color c, color A y color e son para cambiar el color del texto (rojo, verde y amarillo) de modo que resulte más visual.
  • Hacemos un if para poder elegir si hacer la copia o no. Las opciones son si, no, y letra incorrecta que hace que vuelva a preguntar (por si las moscas).
  • echo. deja una línea en blanco, mucho mejor para la presentación del informe final.
  • Le he cambiado los mensajes que da la máquina para darle un toque de humor. ¿Quien dice que las aplicaciones de consola son cutres?

Mini-problema: no es algo que haya necesitado solucionar, pero esto tiene un pequeño fallo (aunque también lo tiene el hacerlo a mano desde el entorno gráfico). Si por ejemplo tienes un archivo llamado index.html, haces la copia y después lo renombras a index.php en la carpeta donde tienes las copias se te habrán quedado 2 ficheros: index.html e index.php. Lo mismo pasaría si borrásemos algo de la carpeta origen, que no se borraría de la destino. La solución es borrar la carpeta destino cuando hagamos este tipo de cambios y copiarlo todo de nuevo. Recomentable hacer una compresión con el 7-zip antes de hacer eso, que más vale prevenir que re-programar 😉

20 comentarios

  • Muchas gracias, la verdad es que me ha servido de mucho, pero tengo una duda,

    Ahora trato de copiar una carpeta a otro ordenador a través de su ip ¿Es esto posible?

    El comando que he usado es este

    echo “Intento de conexion
    xcopy /e /d /y “D:\ServidorVLC4-SERVIDORES” “\\172.xx.xx.xxx\C:\Documents and Settings\beca_web\Escritorio0-NUEVA-PLATAFORMA4-SERVIDORES”

    pero no consigo nada, ¿algún consejo?

    Gracias, sigue así.

    • Si que se puede. Es tan fácil como ir a Equipo y darle a añadir una unidad de red. Así te aparecerá tu equipo con una letra de unidad (puedes asignarle la que tú quieras, yo suelo empezar por la Z) y a partir de ahí modificar el script es pan comido.
      Espero que te sirva. Un saludo!

    • Intenta cambiar c: por c$

  • Ok, voy a probar lo que dices, muchas gracias!

    Un saludo!

  • Jose Carlos Nieto

    Si usases las variables de entorno de Windows ya sería perfecto. Yo en mi caso lo voy a usar tanto en Windows XP como en 7/8, así que necesito unos cuantos IF más para detectar el SO. Tampoco es necesario tener instalado el 7zip. Con tener el ejecutable 7z.exe en el mismo sitio en el que guardes el script ya vale 🙂

    Buen blog.

  • Gracias, me ha sido de gran utilidad.

  • muchas gracias lo adapte a mis necesidades 😉

  • Duda:
    ¿Con qué formato se ha de guardar ese script??
    No me deja pegarlo entero (así como está, en varias lineas) en mi Programador de Tareas de Windows. =/

  • alguna forma de copiar un archivo mediante ip a mas de un pc

  • Hola, gracias por el post, excelente…tengo una duda, ¿cómo hago para copiar la carpeta en varias USB al mismo tiempo?

  • Muchas gracias por tu ayuda, es un aporte muy bueno, solo una pregunta, ¿Cómo puedo hacer para omitir la pregunta de si quiero o no comprimir? me gustaría que lo hiciera de forma automatica. De nuevo muchas gracias.

  • hace muchos años que utilizo xcopy y nunca tuve problemas, pero desde que actualicé a win7 el parametro /d:dd-mm-aa no funciona y probé muchas formas de formato de fecha pero siempre el error es el mismo: Parámtro no válido /d:

  • Sé que ha pasado mucho tiempo desde la publicación del post, pero como me voy a beneficiar de él, adjunto el script que me he preparado para hacer el cambio de ordenador entre windows 7.

    echo No existe la F
    goto exit
    :copia
    REM Documentos de Usuario
    echo Copiando videos
    xcopy /e /y /i /s “%USERPROFILE%\Videos” “UNIDAD:\FECHA\Users\USUARIO\Videos”
    echo Copiando Imágenes
    xcopy /e /y /i /s “%USERPROFILE%\Pictures” “UNIDAD:\FECHA\Users\USUARIO\Pictures”
    echo Copiando Documentos
    xcopy /e /y /i /s “%USERPROFILE%\Documents” “UNIDAD:\FECHA\Users\USUARIO\Documents”
    echo Copiando Música
    xcopy /e /y /i /s “%USERPROFILE%\Music” “UNIDAD:\FECHA\Users\USUARIO\Music”
    echo Copiando Favoritos
    xcopy /e /y /i /s “%USERPROFILE%\Favorites” “UNIDAD:\FECHA\Users\USUARIO\Favorites”
    echo Copiando Escritorio
    xcopy /e /y /i /s “%USERPROFILE%\Desktop” “UNIDAD:\FECHA\Users\USUARIO\Desktop”
    echo Copiando Descargas
    xcopy /e /y /i /s “%USERPROFILE%\Downloads” “UNIDAD:\FECHA\Users\USUARIO\Downloads”
    echo Copiando datos de Firefox
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Local\Mozilla\Firefox\Profiles” “UNIDAD:\FECHA\Users\USUARIO\AppData\Local\Mozilla\Firefox\Profiles”
    echo Copiando datos de Lync
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Local\Microsoft\Office\15.0\Lync” “UNIDAD:\FECHA\Users\USUARIO\AppData\Local\Microsoft\Office\15.0\Lync”
    echo Copiando todos los datos de Outlook
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Local\Microsoft\Outlook” “UNIDAD:\FECHA\Users\USUARIO\AppData\Local\Microsoft\Outlook”
    echo Copiando Libreta personal de direcciones (.pab) (hasta Outlook 2007)
    xcopy /e /y /i /s “%USERPROFILE%\local settings\application data\microsoft\outlook\*.pab” “UNIDAD:\FECHA\Users\USUARIO\local settings\application data\microsoft\outlook”
    echo Copiando Barra de comandos y personalizaciones de menú (.dat)
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Outlook\outcmd.dat” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Outlook\outcmd.dat”
    echo Copiando Configuración del panel de exploración (.xml)
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Outlook\*.xml” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Outlook”
    echo Copiando Caché de direcciones
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Outlook\*.nk2” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Outlook”
    echo Copiando Firmas de Outlook
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Firmas” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Firmas”
    echo Copiando Formularios personalizados de outlook
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Local\Microsoft\FORMS” “UNIDAD:\FECHA\Users\USUARIO\AppData\Local\Microsoft\FORMS”
    echo Copiando Diccionario personalizado
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\UProof” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\UProof”
    echo Copiando Plantillas de Outlook
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Plantillas” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Plantillas”
    echo Copiando Configuración de Enviar y recibir (.srs)
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Outlook\*.srs” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Outlook\*.srs”
    :exit
    echo He terminado
    pause

  • rem cambiar “UNIDAD” por la letra que corresponda (ej. D)
    rem cambiar “USUARIO” por el usuario
    rem Cambiar “FECHA” por día de hoy (Ej. FECHA) Asegurarse que no sobreescribimos nada en la unidad
    @echo off
    if exist UNIDAD:\ goto copia
    echo No existe la F
    goto exit
    :copia
    REM Documentos de Usuario
    echo Copiando videos
    xcopy /e /y /i /s “%USERPROFILE%\Videos” “UNIDAD:\FECHA\Users\USUARIO\Videos”
    echo Copiando Imágenes
    xcopy /e /y /i /s “%USERPROFILE%\Pictures” “UNIDAD:\FECHA\Users\USUARIO\Pictures”
    echo Copiando Documentos
    xcopy /e /y /i /s “%USERPROFILE%\Documents” “UNIDAD:\FECHA\Users\USUARIO\Documents”
    echo Copiando Música
    xcopy /e /y /i /s “%USERPROFILE%\Music” “UNIDAD:\FECHA\Users\USUARIO\Music”
    echo Copiando Favoritos
    xcopy /e /y /i /s “%USERPROFILE%\Favorites” “UNIDAD:\FECHA\Users\USUARIO\Favorites”
    echo Copiando Escritorio
    xcopy /e /y /i /s “%USERPROFILE%\Desktop” “UNIDAD:\FECHA\Users\USUARIO\Desktop”
    echo Copiando Descargas
    xcopy /e /y /i /s “%USERPROFILE%\Downloads” “UNIDAD:\FECHA\Users\USUARIO\Downloads”
    echo Copiando datos de Firefox
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Local\Mozilla\Firefox\Profiles” “UNIDAD:\FECHA\Users\USUARIO\AppData\Local\Mozilla\Firefox\Profiles”
    echo Copiando datos de Lync
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Local\Microsoft\Office\15.0\Lync” “UNIDAD:\FECHA\Users\USUARIO\AppData\Local\Microsoft\Office\15.0\Lync”
    rem echo Copiando todos los datos de Outlook
    rem xcopy /e /y /i /s “%USERPROFILE%\AppData\Local\Microsoft\Outlook” “UNIDAD:\FECHA\Users\USUARIO\AppData\Local\Microsoft\Outlook”
    echo Copiando Libreta personal de direcciones (.pab) (hasta Outlook 2007)
    xcopy /e /y /i /s “%USERPROFILE%\local settings\application data\microsoft\outlook\*.pab” “UNIDAD:\FECHA\Users\USUARIO\local settings\application data\microsoft\outlook”
    echo Copiando Barra de comandos y personalizaciones de menú (.dat)
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Outlook\outcmd.dat” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Outlook\outcmd.dat”
    echo Copiando Configuración del panel de exploración (.xml)
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Outlook\*.xml” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Outlook”
    echo Copiando Caché de direcciones
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Outlook\*.nk2” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Outlook”
    echo Copiando Firmas de Outlook
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Firmas” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Firmas”
    echo Copiando Formularios personalizados de outlook
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Local\Microsoft\FORMS” “UNIDAD:\FECHA\Users\USUARIO\AppData\Local\Microsoft\FORMS”
    echo Copiando Diccionario personalizado
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\UProof” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\UProof”
    echo Copiando Plantillas de Outlook
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Plantillas” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Plantillas”
    echo Copiando Configuración de Enviar y recibir (.srs)
    xcopy /e /y /i /s “%USERPROFILE%\AppData\Roaming\Microsoft\Outlook\*.srs” “UNIDAD:\FECHA\Users\USUARIO\AppData\Roaming\Microsoft\Outlook\*.srs”
    :exit
    echo He terminado
    pause

  • QUE TAL BUEN DIA UTILICE EL SCRIPT Y ME FUNCIONA DE MARAVILLA EN WINDOWS 7 LO UNICO QUE ME FALTA ES COMO MODIFICARLO PARA QUE HAGA EL ARCHIVO EN 7 ZIP SIN PREGUNTAR

  • Hola, Antes que nada, muy buen tutorial. Mi pregunta es la siguiente, colaboro con una radio de distrito donde se graban de forma automática muchos programas. EL tema es que necesitaría crear un script para que cada programa que se graba, luego se copie a una carpeta diferente. El problema es que el programa que usamos para programar las grabaciones (Cyberocorder) no permite escoger distintas carpetas de salida, así que todos los podcast se van al mismo sitió.

    Disculpad mi ignorancia, pero hay alguna forma de usar un script para que todos los programas que se van grabando con un nombre determinado, se puedan copiar automáticamente a carpetas distintas, en función del nombre de cada programa (entendemos programa como podcast de radio)

    Gracias.

  • Aunque este artículo tiene ya sus tiempo por si te sirve de ayuda, como solución a tu pequeño problema que comentas al final te recomiendo que investigues el uso de robocopy.exe.

    Es como xcopy pero mucho más potente y permite en las opciones reflejar un directorio en otro. Yo lo he usado para automatizar backups de disco duro a pendrive y me ha funcionado realmente bien

    La sintaxis sería:

    ROBOCOPY ORIGEN DESTINO /MIR
    MIR modo espejo, Copia de forma recursiva pero al terminar se eliminan los archivos en el destino que ya no existen en el origen.

    Un saludo

  • esto es mucho mas sencillo , pero como lo he realizado siguendo los anteriores comentarios lo cuelgo por si le sirve a alguien , solo hace la copia de una carpeta en otra guardando solo siete copias y borrando la mas vieja , un saludo

    @echo off

    xcopy T:\origen t:\copia_seguridad\copia\ /e/i/y
    if exist t:\copia_seguridad\copia7 rd /s/q T:\copia_seguridad\copia7
    if exist t:\copia_seguridad\copia6 rename t:\copia_seguridad\copia6 copia7
    if exist t:\copia_seguridad\copia5 rename t:\copia_seguridad\copia5 copia6
    if exist t:\copia_seguridad\copia4 rename t:\copia_seguridad\copia4 copia5
    if exist t:\copia_seguridad\copia3 rename t:\copia_seguridad\copia3 copia4
    if exist t:\copia_seguridad\copia2 rename t:\copia_seguridad\copia2 copia3
    if exist t:\copia_seguridad\copia1 rename t:\copia_seguridad\copia1 copia2
    if exist t:\copia_seguridad\copia rename t:\copia_seguridad\copia copia1

  • Buenos días, ando un poco pez en este mundo la verdad, pero me ha parecido muy sencillo la forma de explicarlo. A todo esto, tengo una duda:
    Situación: Tengo un directorio ( y subdirectorios, por lo tanto /s) donde hay archivos con extensión *.x, y quiero convertilos TODOS mediante el uso de un programa al formato *.z, mi idea es usar “forfiles” diciéndoles que:
    forfiles /p “C:\Users\Miname\Desktop\GG” /s /m *.x /c “”C:\Program Files\Bilex Company\Bico 10.3\Bin\Bilex” a -z” “C:\Users\Miname\Desktop\BAKAP” “C:\Users\Miname\Desktop\GG\prueba””

    No sé si se puede ejecutar un programa dentro de forfiles bajo el parámetro /c, y si es así, sabiendo que va entre comillas todos los comandos a ejecutar ( en este caso sería el comando de guardar mis archivos con otra extensión usando el programa ), estaría bien la instrucción o soy un zoquete de la leche?.
    Muchas gracias de antepie!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *