batch datetime file batch-file loops last-modified

datetime - date batch file



Archivo por lotes: Iterar sobre los archivos modificados desde una fecha determinada (2)

Quiero crear un archivo por lotes que ejecute un comando (elimine el archivo, para un ejemplo simple, aunque mi comando sea personalizado / diferente) en cada archivo que coincida con un comodín (digamos * .jpg) que se modificó desde una fecha (como 1-1-2010 o posterior). La fecha puede codificarse en el archivo por lotes o pasar como un parámetro de línea de comando.

Pseudocódigo:

foreach file C:/Images/*.jpg modified-since 1-1-2010 do del file

Preferiría un archivo por lotes puro, no PowerShell, VBScript, etc. Si no es posible usar un lenguaje de proceso por lotes puro, podría usar un programa de línea de comandos de un tercero pequeño / gratuito para ayudar a generar la lista de archivos modificados. Necesito admitir la ejecución en Windows 2000 o posterior.

La solución final que utilicé:

(Ligeramente modificado de la respuesta de pipitas)

@ECHO OFF for /f "usebackq tokens=1-7* delims=/: " %%I in (`dir/o-d/tw ^| findstr /I .jpg`) do ( if "%%K%%I%%J %%N %%L%%M" GEQ "20100801 AM 0000" ( del /P %%P ) )

Algunas notas: Eliminar / P para no requerir la confirmación Y / N en cada eliminación. Escapé del% de caracteres para que trabajaran dentro de un archivo .bat. El ^ es necesario para escapar de la tubería. El "usebackq" hace que los backticks delimiten un comando para ejecutar (en lugar de buscar una cadena o archivo literal), tokens establece el número de variables para colocar la línea analizada comenzando con% I, y delims establece los delimitadores (incluido el espacio final) ) utilizado para analizar la línea en esos tokens. Agregué .jpg como la cadena de búsqueda de findstr, ya que solo quería procesar archivos .jpg. Algunos posibles problemas son que su configuración regional podría imprimir fechas de forma diferente, requiriendo un número diferente de variables o delimitadores diferentes, y puede tener algunas coincidencias falsas positivas con un ".jpg" incrustado en el nombre del archivo (que requiere una expresión de FoundStr, etc.) .

Si no necesita ser compatible con Windows 2000 y versiones anteriores, el uso de archivos for como lo sugirió Johannes lo haría mucho más fácil.



Primero algunos preliminares:

  • dir /od /tw /s ../path/to/somedir :
    lista todos los archivos + subdirectorios del directorio, ordenados por fecha + hora de la última modificación,
  • dir /od /tw /s ../path/to/somedir :
    mismo, pero en orden inverso (el más antiguo es el último).

A continuación, uso un ejemplo local para una ruta existente. Vamonos:

dir /tc /o-d /s gstmp/*yell*.tif ^| findstr 2010 Volume in Laufwerk C: hat keine Bezeichnung. Volumeseriennummer: D479-1658 Verzeichnis von C:/downloads/gstmp 08/06/2010 05:01 PM 19 compression-g4-emptypage-tiffsep1(Yellow).tif 08/06/2010 05:00 PM 19 compression-lzw-emptypage-tiffsep1(Yellow).tif 08/06/2010 04:57 PM 19 compression-g3-tiffsep1(Yellow).tif 08/06/2010 04:57 PM 19 compression-crle-tiffsep1(Yellow).tif 08/06/2010 04:56 PM 19 compression-pack-share-tiffsep1(Yellow).tif 08/06/2010 04:53 PM 19 compression-g4-share-tiffsep1(Yellow).tif 08/06/2010 04:52 PM 19 compression-lzw-share-tiffsep1(Yellow).tif 08/06/2010 04:51 PM 19 compression-default-share-tiffsep1(Yellow).tif 08/06/2010 03:59 PM 19 compression-none-share-tiffsep.Yellow.tif 08/06/2010 03:55 PM 19 share-tiffsep.Yellow.tif 10 Datei(en) 190 Bytes

No nos gusta el encabezado adicional y la información de resumen en este momento. Podemos deshacernos de esto filtrando por algo. Simplemente usaré ''2010''.

Pero ahora comienza el problema real: la fecha y hora de creación pueden posiblemente imprimirse en diferentes formatos, dependiendo de su "configuración regional". Puedes verte a ti mismo, cómo me busca actualmente.

¿No estaría funcionando, si pudiéramos hacer que la fecha se muestre en un formato que coincida exactamente con el orden numérico? Entonces podríamos implementar alguna lógica que decida sobre la eliminación a través de una simple comparación numérica. Probemos (si esto funciona para mí, no necesariamente funcionará para ti, es posible que debas adoptarlo en tu localidad). Tenga en cuenta las ''backquotes'' ("` `") que estoy usando, así como el ^ -sign:

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp/*yell*.tif ^ ^| findstr 2010`) do echo. %I %J %K %L %M %N %O %P

Salida aquí:

08 06 2010 05 01 PM 19 compression-g4-emptypage-tiffsep1(Yellow).tif 08 06 2010 05 00 PM 19 compression-lzw-emptypage-tiffsep1(Yellow).tif 08 06 2010 04 57 PM 19 compression-g3-tiffsep1(Yellow).tif 08 06 2010 04 57 PM 19 compression-crle-tiffsep1(Yellow).tif 08 06 2010 04 56 PM 19 compression-pack-share-tiffsep1(Yellow).tif 08 06 2010 04 53 PM 19 compression-g4-share-tiffsep1(Yellow).tif 08 06 2010 04 52 PM 19 compression-lzw-share-tiffsep1(Yellow).tif 08 06 2010 04 51 PM 19 compression-default-share-tiffsep1(Yellow).tif 08 06 2010 03 59 PM 19 compression-none-share-tiffsep.Yellow.tif 08 06 2010 03 55 PM 19 share-tiffsep.Yellow.tif

Casi allí, pero aún no del todo. Necesitamos cambiar el orden de nuestros tokens %I %J %K a %K %I %J para que nuestra fecha se muestre como 2010 08 06 vez de 08 06 2010 . Además, si escribimos los tokens correctos sin espacios, obtendremos una cadena de fecha y hora para que se pueda comparar fácilmente. Además, omitimos el %O y lo reemplazamos con una flecha, solo por el gusto de hacerlo:

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp/*yell*.tif ^ ^| findstr 2010`) do echo. %K%I%J%L%M%N ==^> %P

La salida cambia ahora a esto:

201008060501PM ==> compression-g4-emptypage-tiffsep1(Yellow).tif 201008060500PM ==> compression-lzw-emptypage-tiffsep1(Yellow).tif 201008060457PM ==> compression-g3-tiffsep1(Yellow).tif 201008060457PM ==> compression-crle-tiffsep1(Yellow).tif 201008060456PM ==> compression-pack-share-tiffsep1(Yellow).tif 201008060453PM ==> compression-g4-share-tiffsep1(Yellow).tif 201008060452PM ==> compression-lzw-share-tiffsep1(Yellow).tif 201008060451PM ==> compression-default-share-tiffsep1(Yellow).tif 201008060359PM ==> compression-none-share-tiffsep.Yellow.tif 201008060355PM ==> share-tiffsep.Yellow.tif

Ahora estás casi listo para comparar el primer campo.

Pero considere esto: obtengo mis tiempos en ciclos de 12 horas, con AM y PM . Entonces, para comparar numéricamente, tenemos que reemplazar PM y AM con un valor numérico cada uno, de tal manera que nuestra traducción de 04:51 AM y 04:50 PM todavía se ordenarán numéricamente de la manera correcta.

Ahora que tal esto:

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp/*yell*.tif ^ ^| findstr 2010`) do ( if "%K%I%J %N %L%M" GEQ "20100806 PM 0457" ( echo. [ %K-%I-%J %L:%M %N %P. ] ) )

Esto enumera todos los archivos que deben eliminarse, también mostrando sus fechas respectivas. Para eliminar realmente , solo tenemos que reemplazar el último echo. ... %P. echo. ... %P. por un del/p/f/s %P