elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Con que comando podría conseguirlo? (.bat)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Con que comando podría conseguirlo? (.bat)  (Leído 4,596 veces)
maiksix

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Con que comando podría conseguirlo? (.bat)
« en: 6 Septiembre 2015, 20:46 pm »

Hola a todos,

estoy intentando hacer un script que me elimine los ficheros de un directorio que sean de hace más de 30 días (basándome en la última fecha de modificación).

Actualmente tengo un par de problemas. El primero es que no se como obtener y guardar la fecha de última modificación de los ficheros en cuestión. Así luego podría compararlos con la fecha que quiero y decidir si eliminar o no.
He probado con el comando dir, pero sólo lista y no me permite hacer la comparación.

Alguna idea de como conseguir la fecha de última modificación del fichero?

El otro problema es como conseguir la fecha de hace 30 días. He probado en restar un mes a la fecha actual, pero siempre da un error de que el valor resultante es decimal o hexadecimal.

Lo hago así:

set mes=%date:~3,2%
set month=mes-1

No se porque salta ese error, si cuando lo hago con los días si que hace la resta correctamente...

Gracias por vuestra ayuda!


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Con que comando podría conseguirlo? (.bat)
« Respuesta #1 en: 6 Septiembre 2015, 21:45 pm »

Buenas. Vayamos por partes:

1. Batch es el peor lenguaje que puedes escojer para este tipo de funcionalidad, deberias pensar seriamente en aprender otro lenguaje (más capacitado).

2. La variable dinámica %DATE% representa la fecha acorde a la cultura actual, es decir, para los yankees el orden del día y mes será diferente. Si solo lo piensas utilizar tú, entonces no hay problema.

3. Las variables numéricas se setean usando el modificador o switch /A, no puedes pretender restarle un número a una variable de texto (string).

4. El mes actual es "09", y al empezar por "0" debes eliminar ese caracter, ya que de lo contrario lo reconoce (indebidamente) como un string hexadecimal, lo que tampoco te dejará restarlo.

En resumen, esta tediosa barbarie:
Código
  1. @Echo OFF
  2.  
  3. Set "month=%date:~3,2%"
  4.  
  5. :: Elimino el posible "0" y convierto la variable a numérica.
  6. If "%month:~0,1%" EQU "0" (Set /A "month=%month:~1%")
  7.  
  8. :: Le resto un mes.
  9. Set /A "month-=1"
  10.  
  11. :: Si el dígito es "0" (Enero-1), cambiamos a "12" (Diciembre)
  12. If %month% EQU 0 (Set /A "month=12")
  13.  
  14. :: Si el mes solo tiene un dígito (1...9) le añadimos un "0", e
  15. :: indiferentemente convertimos la variable a string.
  16. If %month% LSS 10 (Set "month=0%month%") Else (Set "month=%month%")
  17.  
  18. Echo %month%
  19.  
  20. Pause&Exit /B 0

Eso solamente para el tema de la fecha.

5. El uso adecuado del comando DIR sería el siguiente, excluyendo carpetas y mostrando la fecha de modificación:
Código:
DIR /A-D /O-D

6. Para "filtrar" la salida del comando DIR debes usar un búcle de tipo for-files FOR /F mediante el uso del parámetro tokens para separar la fecha del resto de información (fecha, nombre del archivo)

Ejemplo:
For /f - Loop through text - SS64

7. La metodología de "filtrar" la salida del comando DIR para este tipo de "filtración por fechas" es obsoleta e innecesaria, ya que a partir de Windows VISTA dispones del "nuevo" comando ForFiles (y también tienes como alternativa RoboCopy).

Un ejemplo con ForFiles, al que le pasarías el mes obtenido con el código de arriba, y donde cambiarías el comando Echo por lo que quieras (ej. DEL):
Código
  1. forfiles.exe /p "%CD%" /s /m *.* /c "cmd /c Echo @path" /D "-%day%/%month%/%year%"

O también puedes hacerlo de un modo más directo y eficiente, especificando -30 días y listo:
Código
  1. forfiles.exe /p "%CD%" /s /m *.* /c "cmd /c Echo @path" /D "-30"

Saludos


« Última modificación: 6 Septiembre 2015, 21:52 pm por Eleкtro » En línea



maiksix

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Con que comando podría conseguirlo? (.bat)
« Respuesta #2 en: 7 Septiembre 2015, 09:38 am »

Hola elektro y gracias por tu ayuda.

Primero disculparme por el doble post. Y segundo por las posibles faltas, escribo desde el movil.

1. Porque dices que es el peor lenguaje para hacer esto? Que me recomendarias pues? Soy nuevo en temas de scripting.

2. Lei algo de lo del 0 en la fecha y probe borrarlo pero no lo logre. Porque pones lo de ~0,1 en el month? No entiendo muy bien, igual que lo del date~3,2. Es decir, entiendo que hacen pero no veo su significado o similitud con otro lenguaje.

3. Gracias por el codigo, lo he probado y funciona aunque no la parte de añadir el 0 y la de setear a 12 el mes.

4. Me mirare lo del dir y el for luego.

5. Estoy probando el forfiles y si que funciona perfectamente en el cmd, pero no lo pilla cuando lo meto en un .bat y ejecuto. Dice que no existe tal comando... A que se debe?

Gracias, un saludo!
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Con que comando podría conseguirlo? (.bat)
« Respuesta #3 en: 8 Septiembre 2015, 00:09 am »

1. Porque dices que es el peor lenguaje para hacer esto?

Por qué Batch es un lenguaje muy limitado, según palabras oficiales de Microsoft es un lenguaje ideado para automatizar algunas tareas comunes del sistema y poco más, cualquier cosa se vuelve tediosa desarrollarla en Batch (quiero decir, muchas más lineas de código en comparación con otro lenguaje) por que no es un lenguaje que exponga miembros o conceptos esenciales que se pueden encontrar en la mayoría de los otros lenguajes actuales, ya sean lenguajes de Scripting o compilados, empezando por el soporte para un miserable Array.

Depender de procesos externos (o mal llamados "comandos externos") como ping.exe, forfiles.exe, findstr.exe, etc solamente para poder realizar la mayoría de operaciones "esenciales" en Batch ...eso ya lo dice todo por si mismo, cada llamada a esos procesos se traduce en tiempo de ejecución que se debe consumir hasta que el proceso se inicie y devuelve el valor de retorno, Batch es lento y todas sus cosas lo vuelven todavía más lento si cabe, es muy lento sobre todo cuando se trata de iterar texto o archivos, cómo es el caso de lo que tú necesitas llevar a cabo.

En resumen, no se puede trabajar bien un código en Batch por que hay que acabar dándole mil vueltas a cualquier algoritmo simple, y eso lo vuelve tedioso ...insufrible, es así de simple.



Que me recomendarias pues? Soy nuevo en temas de scripting.

Dentro de los lenguajes integrados en Windows, si simplemente buscas algo más o menos tan sencillo cómo Batch ...pero que le da mil vueltas, ese lenguaje sería VisualBasicScript (VBS) (aunque es otro lenguaje muy limitado también), y luego le seguiría PowerShell (PS).

Si tu intención es aprender programación, entonces ninguno de esos lenguajes sería una buena opción, puedes empezar por Ruby o Python por ejemplo en lo referente al Scripting. Pero no te guies por una simple opinión cómo la mía, el mejor lenguaje siempre será aquél con el que más agusto te sientas (al escribi la sintaxis) y con el que puedas realizar todas las tareas que necesites hacer. Pero prueba algo distinto a Batch para comparar, hazme caso en eso.

Mi primer lenguaje fue Batch ...hace muchos años ya, por ese motivo entiendo que una persona no puede ser consciente de la mierd@ que supone Batch y de todos los inconvenientes, innecesarios inconvennientes por los que estás pasando para hacer cualquier código hasta que descubras un lenguaje de verdad.



2. Lei algo de lo del 0 en la fecha y probe borrarlo pero no lo logre. Porque pones lo de ~0,1 en el month? No entiendo muy bien, igual que lo del date~3,2. Es decir, entiendo que hacen pero no veo su significado o similitud con otro lenguaje.

Ese tipo de acción se denomina SubString y consiste en extraer una serie de caracteres de un string.

En este código:
Código:
Echo %DATE:~3,2%

...y sabiendo que la fecha es 08/09/2015, el dígito 3 indica el inicio de la extracción (es decir, el cuarto caracter del string empezando por la izquierda), y el 2 indica la longitud de la substracción, por ende, se extraerá el string "09", el mes.

Imaginate al "3" y al "2" cómo dos parámetros a los que podemos llamar imaginariamente "StartPosition" y "Length".

Puedes ver cómo sería un substring en otros lenguajes, no se parecen nada a Batch.



3. Gracias por el codigo, lo he probado y funciona aunque no la parte de añadir el 0 y la de setear a 12 el mes.

Especifica que Windows tienes, ya que en las diferentes versiones de Windows existen pequeñas diferencias entre los comandos, tal vez el comando "Set" o la variable "DATE" u otra cosa podría tener un comportamiento distinto al que tiene en el S.O. donde lo he testeado yo, Windows 8.1.



5. Estoy probando el forfiles y si que funciona perfectamente en el cmd, pero no lo pilla cuando lo meto en un .bat y ejecuto. Dice que no existe tal comando... A que se debe?

Si dice que no existe significa que el archivo "forfiles.exe" no se puede encontrar en el directorio de trabajo actual, pero existir, existe en tu sistema cómo ya has comprobado.

Lo que comentas es extraño, ya que debería detectar correctamente el forfiles.exe aunque modifiques el directorio de trabajo.

Comprueba que tienes agregada la ruta "C:\Windows\System32" en a variable de entorno PATH, con el siguiente comando en consola:
Código:
(path | findstr /i "%SystemRoot%\System32")1>NUL && (Echo Si Existe) || (Echo No Existe)

De todas formas siempre puedes especificar la ruta completa cuando necesites usarlo, por ejemplo:

Código
  1. @Echo OFF
  2.  
  3. "%SystemRoot%\System32\forfiles.exe" argumentos
  4.  

Saludos
En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Decodificador! donde conseguirlo?
Multimedia
El Hermitaño 5 3,020 Último mensaje 22 Julio 2004, 02:39 am
por El Hermitaño
F-zero pa nintendo 64 donde puede conseguirlo???????
Juegos y Consolas
nospher 1 1,728 Último mensaje 15 Febrero 2006, 02:06 am
por no_manzana
Bootkit, donde conseguirlo.
Seguridad
Nikoxx99 0 1,898 Último mensaje 3 Octubre 2014, 23:38 pm
por Nikoxx99
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines