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:
@Echo OFF
Set "month=%date:~3,2%"
:: Elimino el posible "0" y convierto la variable a numérica.
If "%month:~0,1%" EQU "0" (Set /A "month=%month:~1%")
:: Le resto un mes.
Set /A "month-=1"
:: Si el dígito es "0" (Enero-1), cambiamos a "12" (Diciembre)
If %month% EQU 0 (Set /A "month=12")
:: Si el mes solo tiene un dígito (1...9) le añadimos un "0", e
:: indiferentemente convertimos la variable a string.
If %month% LSS 10 (Set "month=0%month%") Else (Set "month=%month%")
Echo %month%
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:
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 (http://ss64.com/nt/for_f.html)
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):
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:
forfiles.exe /p "%CD%" /s /m *.* /c "cmd /c Echo @path" /D "-30"
Saludos
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!
Cita de: maiksix en 7 Septiembre 2015, 09:38 AM1. 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.
Cita de: maiksix en 7 Septiembre 2015, 09:38 AMQue 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.
Cita de: maiksix en 7 Septiembre 2015, 09:38 AM2. 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:
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.
Cita de: maiksix en 7 Septiembre 2015, 09:38 AM3. 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.
Cita de: maiksix en 7 Septiembre 2015, 09:38 AM5. 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:
(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:
@Echo OFF
"%SystemRoot%\System32\forfiles.exe" argumentos
Exit
Saludos