windows - ddmmyyyy - get date cmd script
FORFILES date-after-(date calc en el archivo cmd) (2)
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 sintaxis 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
anidados 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 por elementos que son al menos tan antiguos como los dados por la variable MINAGE
. El bucle forfiles
interno, que se repite 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.