2012-02-19 18 views
9

estoy obligado a escribir un archivo por lotes para hacer algunas cosasAl comparar una fecha de archivo modificado con la fecha actual en un archivo por lotes

Al principio pensé que mi problema era muy simple - capturar la fecha de modificación de un txt archivo ubicado en un directorio específico, compare esa fecha con la fecha actual y si son lo mismo, haga algo. Si no son así, haz otra cosa.

La línea que utilizo para capturar la fecha actual es:

%date% 

Las líneas que utilizo para capturar la fecha de modificación de mi archivo especificado es:

SET filename="C:\New Folder\New.txt" 
FOR %%f IN (%filename%) DO SET filedatetime=%%~tf 
ECHO %filedatetime:~0,-6% >> %destination% 

En el caso anterior I' m simplemente usando echo para ver lo que se devuelve y parece que la fecha se devuelve pero obtengo información adicional:

2012/02/19 02

Me gustaría saber cómo obtener los valores anteriores donde son comparables y cómo compararlos correctamente.

Respuesta

9

me gusta dbenham's manera, pero si usted desea hacer su trabajo de código que puede hacer como esto:

set currentDate=%date% 
SET filename="C:\MyFile.txt" 

FOR %%f IN (%filename%) DO SET filedatetime=%%~tf 
IF %filedatetime:~0, 10% == %currentDate% goto same 

goto notsame 

:same 
echo Dates the same, do some code here 

goto next 

:notsame 
echo Dates NOT the same, do some code here 
goto end 

:next 

pensamos que sería vale la pena saber cómo hacer que el suyo funcione en caso de que necesite de nuevo.

+5

Eso no siempre funciona, no lo hace en mi máquina porque% date% tiene el prefijo del día de la semana. Los formatos de fecha cambian según la configuración regional, una de las cosas que dificulta las fechas. Por lo general, es fácil hacer que algo funcione en una máquina determinada, pero una solución general suele ser difícil. – dbenham

+0

Cierto. Preferí tu respuesta. Es bueno saber sobre el día de la semana, muy al azar. – SmithMart

+0

Esto funciona como un encanto. Me acabas de salvar un ** de ser pateado :) – akhil

12

Trabajar con fechas es mucho más difícil en el lote de lo que debería ser.

Hay un comando que puede hacer su trabajo más fácil en este caso. FORFILES tiene la capacidad de procesar archivos que se han modificado desde una fecha determinada. Use FORFILES /? desde la línea de comandos para obtener documentación sobre su uso.

Este simple comando, aparecerá una lista de todos los archivos que han sido modificados hoy:

forfiles /m * /d 0 

Si no se encuentra al menos un archivo, a continuación, ERRORLEVEL se establece en 0, de lo contrario ERRORLEVEL se establece en 1.

Tiene un archivo específico, por lo que puede usar

forfiles /m %filename% /d 0 
if %errorlevel% == 0 (
    echo The file was modified today 
    REM do whatever else you need to do 
) else (
    echo The file has not been modified today 
    REM do whatever else you need to do 
) 

Hay una forma más concisa de hacer lo anterior. El operador && se usa para ejecutar comandos de manera condicional si el comando anterior fue exitoso, || se usa para ejecutar comandos de manera condicional si falló el comando anterior. Sin embargo, tenga cuidado, los comandos || también se ejecutarán si el comando (s) && falló.

forfiles /m %filename% /d 0 && (
    echo The file was modified today 
    REM do whatever else you need to do 
) || (
    echo The file has not been modified today 
    REM do whatever else you need to do 
) 
+0

Esto funciona bien, pero ¿hay alguna forma de silenciar la salida que genera? – pcnate

+0

@pcnate - Claro, simplemente redirige stdin y stderr a NUL. 'forfiles/m% filename%/d 0> nul 2> nul ...' – dbenham

+0

@dbenharm Thx. Parece que esto solo funciona si el '/ d - nn' coincide con la fecha modificada. ¿Alguna forma de hacer coincidir algo más nuevo que '/ d - nn'? – pcnate

1

Además de los problemas planteados en los comentarios adjuntos al artículo de TechNet que documenta ForFiles ForFiles Documentation on Microsoft TechNet, hay otro problema que se menciona, pero solo si lee entre las líneas con respecto a la zona horaria que se ignora.Dado que ForFiles evalúa la fecha modificada informada en la hora local, tratará un archivo modificado en 02:01 EST como anterior que en un archivo modificado en 02:59 EDT.

Cuestiones relacionadas