18 respuestas
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
@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
floriaan60
Ouais... Euh puedes explicarme un poco más en detalle? Porque no entiendo todo el código lol
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
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
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
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
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).
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).
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
@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
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?
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?
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?
He puesto el .bat en la carpeta de lo que quiero copiar.
2006 está vacío
tmp2 está vacío
pero ¿copia las carpetas?
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
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
tengo esta línea
for /F "tokens=4" %I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\%%i" "C:\2006\"
for /F "tokens=4" %I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\%%i" "C:\2006\"
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
@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
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
@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
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
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
Puedes retirar el echo %MONREP%, es solo para depurar y reemplazar copy por move.
Creo que si uno funciona, el otro también funcionará.
Creo que si uno funciona, el otro también funcionará.
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?
y no tendrás algún truco para copiar también las carpetas que contienen archivos de 2006 con la estructura de directorios?
Algo así como esto:
Seguramente perfectible: eliminación de carpetas vacías, por ejemplo
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
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?
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?