Mover archivo

floriaan60 -  
 PYJ_31 -
Hola,

Me gustaría poder crear un archivo .bat para mover los archivos cuya fecha sea anterior a 2006.

utilizo el comando 'move (ruta)(destino)'
pero no sé cómo decirle 'o la fecha es anterior a 2006'
Configuración: Windows XP Firefox 2.0.0.14

18 respuestas

  1. PYJ_31
     
    Intenta esto:

    @echo off

    rem listamos los archivos del directorio actual ordenados por fecha de modificación y escribimos la lista en el archivo tmp
    dir /O:D /T:W > tmp

    rem Solo mantenemos los archivos y solo aquellos de 2006
    findstr /V /C:"<REP>" "tmp"|findstr /C:"/2006" > tmp2

    rem Borramos el archivo tmp
    del tmp

    rem para cada entrada, borramos el archivo, aquí simulado con un echo (del /F /Q)
    for /F "tokens=4" %%I IN (tmp2) DO @echo %%I

    rem Borramos el archivo tmp2
    del tmp2
    1
    1. floriaan60
       
      Ouais... Euh puedes explicarme un poco más en detalle? Porque no entiendo todo el código lol
      0
  2. PYJ_31
     
    Perdón, eso demuestra que no soy un buen desarrollador ;p

    DIR /O:D /T:W > tmp
    Hago un dir para listar los archivos del directorio. La opción O:D permite ordenar las entradas por fecha, la opción T:W define el campo de fecha como la fecha de la última modificación. El > tmp permite redirigir la salida hacia un archivo tmp (podría llamarlo toto.txt si prefieres...), lo que hace que no haya salida del dir sino que todo esté en un archivo tmp (si ejecutas el comando en una ventana cmd (Inicio > Ejecutar > cmd), no verás nada mostrarse, pero si abres tmp con notepad, verás la salida del dir!

    FINDSTR /V /C:"<REP>" "tmp" | FINDSTR /C:"/2006" > tmp2
    Aquí fui cruel contigo! usé findstr para buscar las líneas en el archivo tmp QUE NO CONTENGAN (opción /V) la cadena de caracteres (la opción /C:) <REP> para conservar solo los archivos. El | es lo que llamamos un "pipe", permite redirigir (como el > arriba) la salida de un comando hacia otro comando, que en este caso es otro findstr que buscará las líneas QUE CONTENGAN la cadena de caracteres /2006 en el resultado (y por tanto solo la lista de archivos, sin los directorios) de la orden anterior.

    FOR /F "tokens=4" %%I IN (tmp2) DO @ECHO %%I
    En resumen, dice “Para cada 4o campo que vaya a ser I en el archivo tmp2, ejecuta la orden @ECHO (el @ evita mostrar la línea c:\echo ...) con el contenido de I. Los campos están separados por espacios o tabulaciones (mira la salida del dir, y verás que el nombre del archivo está en el cuarto campo).
    Los dos % son para el script, en una ventana de comandos, uno solo basta (ver cmd /?).
    Para ti, reemplazarás el echo por un DEL /F /Q

    Te invito a escribir cada comando con /? como parámetro para mostrar la ayuda, tendrás más detalles.

    En realidad si miras bien, podría haber escrito:
    DIR /T:W | FINDSTR /V /C:"<REP>" | FINDSTR /C:"/2006" > tmp
    FOR /F "tokens=4" %%I IN (tmp) DO @ECHO %%I

    Pero preferí descomponer un poco
    1
  3. PYJ_31
     
    Ha, aprovechando, algunas mejoras posibles:
    Reemplazar /2006 por una variable que puedas definir como parámetro de tu script (claves parámetro correspondiente a %1, %2....%0 siendo el nombre del script)
    Agregar una variable después de las opciones del dir que contenga la ruta a los archivos que quieres procesar
    ...

    Te aconsejo escribir HELP en una interfaz de línea de comandos, verás los comandos básicos del shell de Windows y NET HELP para ver a qué llamamos los comandos NT4
    1
  4. PYJ_31
     
    Eh bien, en VBS es mejor... Perdón, ¡lo encontraba divertido hacerlo en batch!

    Pero floriaan60, te aconsejo que te pongas al VBS para la administración de Windows, aunque personalmente no me gusta nada (no encuentro este lenguaje lógico, prefiero C/C++ o los lenguajes de shell de Unix (BASH, KSH...) que me parecen más simples).
    1
  5. yoogui Mensajes publicados 2056 Estado Miembro 316
     
    xcopy with the /D option?
    0
  6. floriaan60
     
    me gustaría usar move ...
    o entonces copiar y luego eliminar
    0
    1. floriaan60
       
      sí, pero D/ va a copiar mis archivos modificados desde 2006, pero quiero al revés. es decir, los archivos no modificados desde 2006.
      0
      1. floriaan60 > floriaan60
         
        xcopy c:\Temp*.?????? c:\2006 /s /e
        'No se puede realizar una copia cíclica'

        ¿Por qué?
        0
  7. yoogui Mensajes publicados 2056 Estado Miembro 316
     
    xcopy c:\Temp*.?????? c:\2006 /s /e

    Qu'est-ce que le ".??????" ?

    Cmd = xcopy [source] [Dest] [Option]

    Là tu as 3 paramètres.. le 2e est étrange
    0
    1. floriaan60
       
      en fait j’essaie de copier les fichiers non modifiés depuis une date, or, D/ copie les fichiers qui ont été modifiés depuis une date
      0
  8. floriaan60
     
    d’accord.
    Mais au final, où est mon dossier avec tous les fichiers non modifiés depuis 2006 ? lol
    0
    1. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120
       
      Creo que está en ningún lugar por ahora, solo los muestra ( echo %%i ).

      Si quieres moverlos, reemplaza echo %%i por move %%i D:\TonDossier
      0
  9. floriaan60
     
    al final tengo este código:

    @echo off

    rem se listan los archivos del directorio actual ordenados por fecha de modificación y se escribe la lista en el archivo tmp
    dir /O:D /T:W > tmp

    rem Solo quedarán los archivos y solo los de 2006
    findstr /V /C:"<REP>" "tmp"|findstr /C:"/2006" > tmp2

    rem Se borra el archivo tmp
    del tmp

    rem para cada entrada, se borra el archivo, aquí simulado con un echo (del /F /Q)
    for /F "tokens=4" %I IN (tmp2) DO move %%i C:\2006

    rem Se borra el archivo tmp2
    del tmp2

    Tengo tmp2 que se crea en mi escritorio pero es todo lo que veo jajaja
    0
    1. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120
       
      En el estado, el batch debe ubicarse en el mismo directorio donde están los datos a mover. Si quieres poder ejecutarlo desde cualquier ubicación, debes añadir al inicio del batch el comando

      DIR C:\TonRepertoireSource /O:D /T:W > tmp (pon comillas si el nombre del directorio fuente contiene espacios. "C:\Documents dnd Settings\User\Mes documents" por ejemplo)

      ¿Hay algo en C:\2006 ?

      Abre tu archivo tmp2 con el bloc de notas, ¿qué hay dentro?
      0
  10. floriaan60
     
    He quitado el contenido de 2006
    He puesto el .bat en la carpeta de lo que quiero copiar.
    2006 está vacío
    tmp2 está vacío

    pero ¿copia las carpetas?
    0
    1. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120
       
      ¿Qué sale de hacer un DIR /OD /TW a mano en DOS? ¿Hay bien archivos de 2006 primero?

      Para las subcarpetas, no las recorre, y eso está por encima de mis habilidades.

      Por cierto, ¿por qué a toda costa un batch?
      0
      1. floriaan60 > onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención  
         
        acabo de notar que no tenía un archivo 2006 jajajá
        entonces cambié y puse 2008
        ahora en tmp2 hay 3 archivos pero nada en 2006
        0
      2. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120 > floriaan60
         
        Tienes esta línea:

        for /F "tokens=4" %I IN (tmp2) DO move %%i C:\2006

        o aquella otra

        for /F "tokens=4" %%I IN (tmp2) DO move %%i C:\2006 ?

        Sólo la segunda es correcta.

        ¿Y por qué un batch?
        0
  11. PYJ_31
     
    Intenta en su lugar:
    dir "c:\tu directorio" /O:D /T:W

    No olvides los dos puntos, de lo contrario no funciona.

    Perdón, había olvidado que querías mover...

    ¿No tienes un archivo 2006 en tu c:\ por casualidad? en caso de duda, añade las comillas alrededor de c:\2006 y pon un \ al final. También añade la ruta completa de tu archivo fuente.
    for /F "tokens=4" %I IN (tmp2) DO move "c:\tu directorio\"%%i "C:\2006\"

    Para no fastidiarte, después de @echo off, añade la línea SET MONREP="c:\mirepositorio\" y reemplaza "c:\mirepositorio\" por %%MONREP
    0
  12. floriaan60
     
    tengo esta línea
    for /F "tokens=4" %I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\%%i" "C:\2006\"
    0
    1. floriaan60
       
      código por lotes:

      @echo off

      rem se listan los archivos del directorio actual ordenados por fecha de modificación y se escribe la lista en el archivo tmp
      dir /O:D /T:W > tmp

      rem Solo se mantienen los archivos y solo los de 2006
      findstr /V /C:"<REP>" "tmp"|findstr /C:"/2008" > tmp2

      rem Se elimina el archivo tmp
      del tmp

      rem para cada entrada, se elimina el archivo, aquí simulado con un echo (del /F /Q)
      for /F "tokens=4" %I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\"%%i "C:\2006\"

      rem Se elimina el archivo tmp2
      del tmp2
      0
      1. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120 > floriaan60
         
        for /F "tokens=4" %%I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\"%%i "C:\2006\"
        0
      2. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120 > onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención  
         
        Au fait POURQUOI UN BATCH (mais tu vas répondre à la fin ?)
        0
      3. floriaan60 > onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención  
         
        Pues ahora ya no tengo tmp2 y la carpeta 2006 está vacía jaja
        un batch para automatizar el trabajo de las transferencias.
        0
      4. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120 > floriaan60
         
        Supongo que es para automatizar los desplazamientos, pero un script vbs sería mucho más sencillo de hacer que un archivo bat, donde a menudo hay que enredar las órdenes de DOS. Además, un script VBS permitiría gestionar las subcarpetas, lo que me parece misión imposible en bat.
        0
  13. PYJ_31
     
    J’ai Windows XP SP2 et ça ça marche chez moi (en gras ce que j’ai modifié
    @echo off

    SET MONREP=c:\
    echo %MONREP%


    rem on liste les fichiers du répertoire en cour en triant par date de modification et on écrit la liste dan le fichier tmp
    dir %MONREP% /O:D /T:W > tmp

    rem On ne garde que les fichier et on ne garde que ceux de 2006
    findstr /V /C:"<REP>" "tmp"|findstr /C:"/2006" > tmp2

    rem On efface le fichier tmp
    del tmp

    rem pour chaque entrée, on efface le fichier, ici simulé par un echo (del /F /Q)
    for /F "tokens=4" %%I IN (tmp2) DO copy "%MONREP%%%I" C:\2006

    rem On efface le fichier tmp2
    del tmp2
    0
  14. PYJ_31
     
    Y para más información, ni
    for /F "tokens=4" %I IN (tmp2) DO move %%i C:\2006

    ni
    for /F "tokens=4" %%I IN (tmp2) DO move %%i C:\2006

    no funcionarán porque es
    for /F "tokens=4" %I IN (tmp2) DO move %%I C:\2006
    0
  15. PYJ_31
     
    Puedes retirar el echo %MONREP%, es solo para depurar y reemplazar copy por move.
    Creo que si uno funciona, el otro también funcionará.
    0
  16. floriaan60
     
    Funciona. El archivo .bat colocado en el escritorio copió los archivos contenidos en la raíz de C:.
    0
  17. floriaan60
     
    desplazamiento ok también.
    y no tendrás algún truco para copiar también las carpetas que contienen archivos de 2006 con la estructura de directorios?
    0
    1. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120
       
      Ver comentario 29
      0
      1. floriaan60 > onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención  
         
        ah, lo siento, estaba oculto.
        ¿Y en VBScript cómo quedaría?
        0
      2. floriaan60 > floriaan60
         
        Conozco ligeramente los comandos DOS, así que me dije que vamos a hacer un .bat
        pero el vbs no lo conozco en absoluto ...
        0
      3. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120 > floriaan60
         
        Algo así como esto:

         Sub DeplaceFichiers(LaSource, LaDestination) ' Crea el directorio de destino If Not Fso.FolderExists(LaDestination) Then fso.CreateFolder LaDestination End If Set Dossier = fso.GetFolder(LaSource) Set Fichiers = Dossier.Files ' Mueve los archivos For Each fichier in fichiers If year(fichier.DateLastModified) ="2006" Then fso.MoveFile fichier.path, LaDestination End If Next ' Subcarpetas Set Dossiers = fso.GetFolder(LaSource).SubFolders For Each dossier in Dossiers ' Recursividad DeplaceFichiers dossier.path, LaDestination & dossier.name & "\" Next End Sub Set fso = CreateObject("Scripting.FileSystemObject") Source = "H:\DISQUE_F_A_TRIER" Dest = "H:\VieuxFichiers\" DeplaceFichiers Source, Dest 


        Seguramente perfectible: eliminación de carpetas vacías, por ejemplo
        0
  18. PYJ_31
     
    Hum, no eres nada complicado, eh, tipo ;p

    Yo haré un archivo rep.txt en el mismo directorio que mi batch, que contenga la lista de todos los caminos implicados (ATENCIÓN NO HACER ESTO EN C:\WINNT\SYSTEM32)

    Crearé luego un batch con algo tipo (te dejo perfeccionarlo…) :

    FOR %%J IN (rep.txt) DO CALL batch1.bat %%J

    y en batch1.bat, reemplazaré SET MONREP=c:\ por SET MONREP=%1%

    Pero debe haber otros medios.

    ¿El equipo 29, no lo encontré, es normal?
    0
    1. onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120
       
      Porque te buscaste mal, está por encima del 25 :)
      0