FORFILES date -after- (date calc en el archivo cmd)

Me gustaría utilizar FORFILES en un archivo cmd, para actuar en todos los archivos después de una fecha determinada hasta “hoy”. Puedo usar algo como forfiles /d +07/10/2013 /c "cmd /c echo @fname" para actuar en todo después del 7/10/13, pero lo que quiero es poder calcular en vez de 90 días antes de hoy”.

¿Hay una syntax para el cálculo de la fecha que funcione en un archivo cmd que me permita especificar “x días antes de hoy” para enviar a FORFILES?

Prefiero no usar VBS (y encontré un fragmento de código que funcionaría en VBS), aunque alternativamente podría volver a escribir mi script para Powershell, pero lo ideal es que me quede con cmd.

Para aclarar, “-90” encontraría todos los archivos anteriores a 90 días; “+90” encontraría todos los archivos con más de 90 días de vigencia después de hoy (lo cual es fundamentalmente inútil, ya que los archivos rara vez se escriben con fechas futuras), y “+7/30/2013” encontrará todos los archivos más nuevos que el 7/30 / 2013. Quiero ese último período de tiempo, preferiblemente capaz de tomar una variable de número de días pasada al archivo CMD, que diga “después de x número de días antes de hoy”, es decir, “en los últimos x días”. Entonces, en lugar de usar la fecha codificada como se muestra arriba, quiero poder calcular esa fecha dentro del archivo cmd.

En PowerShell puedes hacer algo como esto:

 $refdate = (Get-Date).AddDays(-90) gci | ? { $_.LastWriteTime -ge $refdate } | select Name 

Aquí hay una forfiles para la falla de diseño de los forfiles /D +dd days, suponiendo que no se pueden modificar elementos en el futuro, y que se basa en dos bucles forfiles nesteds y se basa en el hecho de que forfiles configura el ErrorLevel en caso no hay elementos que coincidan con los criterios de búsqueda proporcionados:

 rem Define minimum and maximum age in days here (0 means today): set /A MINAGE=0, MAXAGE=90 set "MAXAGE=%MAXAGE:*-=%" & set "MINAGE=%MINAGE:*-=%" & set /A MAXINC=MAXAGE+1 > nul forfiles /D -%MINAGE% /C "cmd /C if @isdir==FALSE 2> nul forfiles /M @file /D -%MAXINC% || > con echo @fdate @file" 

El bucle forfiles externo itera a través de elementos que son al menos tan antiguos como los dados por la variable MINAGE . El bucle forfiles interno, que itera una vez como máximo al @file archivo iterado @file desde el bucle externo, devuelve el mismo archivo si también es al menos tan antiguo como MAXINC (es igual a MAXAGE más 1 ); si no lo es, forfiles establece ErrorLevel en 1 , que a su vez es capturado por || operador que ejecuta el siguiente comando, a saber, echo , solo en caso de que ErrorLevel se haya establecido en un valor distinto de cero.

Tanto MINAGE como MAXAGE no deben ser números negativos (los comandos set "MAXAGE=%MAXAGE:*-=%" y set "MINAGE=%MINAGE:*-=%" quitan el signo menos en el caso). La variable interina MAXINC se ha introducido para incluir la edad especificada por MAXAGE en el resultado devuelto.

La redirección > nul impide que los forfiles a tener líneas vacías y la interna devuelva elementos que cumplan sus criterios de búsqueda (porque estamos interesados ​​en aquellos que no lo hacen). 2> nul evita que el bucle forfiles interno forfiles mensajes de error en caso de que se violen sus criterios de búsqueda. > con anula > nul para que el comando echo devuelva realmente los elementos requeridos.

La parte if @isdir==FALSE filtra los directorios para que solo se procesen los archivos. Cambie FALSE a TRUE si desea procesar solo directorios; eliminarlo por completo si desea procesar ambos.