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

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
floriaan60
 
Ouais... Euh puedes explicarme un poco más en detalle? Porque no entiendo todo el código lol
0
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
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
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
yoogui Mensajes publicados 2056 Estado Miembro 316
 
xcopy with the /D option?
0
floriaan60
 
me gustaría usar move ...
o entonces copiar y luego eliminar
0
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
floriaan60 > floriaan60
 
xcopy c:\Temp*.?????? c:\2006 /s /e
'No se puede realizar una copia cíclica'

¿Por qué?
0
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
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
floriaan60
 
d’accord.
Mais au final, où est mon dossier avec tous les fichiers non modifiés depuis 2006 ? lol
0
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
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
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
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
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
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
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
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
floriaan60
 
tengo esta línea
for /F "tokens=4" %I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\%%i" "C:\2006\"
0
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
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
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
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
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
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
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
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
floriaan60
 
Funciona. El archivo .bat colocado en el escritorio copió los archivos contenidos en la raíz de C:.
0
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
onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120
 
Ver comentario 29
0
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
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
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
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
onesdf Mensajes publicados 375 Fecha de registro   Estado Miembro Última intervención   120
 
Porque te buscaste mal, está por encima del 25 :)
0