Escribí el siguiente lote para obtener la última fecha de modificación. El problema es que lo da en la hora del reloj y no en la hora UTC. Sé que tengo el retraso en minutos, pero no es tan simple hacer el cambio del número con el archivo por lotes. ¿Hay una bandera para darle a wmic para obtener la hora UTC? Este es el archivo por lotes
@echo off
setlocal enableextensions disabledelayedexpansion
set file=%1
set WORKINGdir=%~dp0
rem wmic wants double backslash
set PATHfile=%WORKINGdir%%file%
set PATHfile=%PATHfile:\=\\%
for /f %%a in (
'wmic DataFile where "Name='%PATHfile%'" get lastmodified ^| find "+" '
) do set "val=%%a"
echo %val%
rem get first 14 digits (good until year 9999)
echo %val:~0,14%
endlocal
Esto me da esta salida:
20161026144823.620815+120
20161026144823
HKLM\System\CurrentControlSet\Control\TimeZoneInformation
para determinar la configuración de zona horaria actual y hacer los ajustes basados en una declaración condicional.Respuestas:
De hecho, la aritmética de marca de tiempo es un dolor. Ajustar la hora a UTC podría dar como resultado una fecha diferente, lo que significa que puede tener que preocuparse por cuántos días en el mes, y puede que tenga que preocuparse por los años bisiestos.
WMIC no tiene ninguna disposición integrada para formatear la marca de tiempo como UTC. Y el lote ciertamente no tiene prácticamente soporte para manejar la aritmética de fecha / hora.
He escrito una utilidad llamada JREN.BAT que puede resolver su problema fácilmente. Fue escrito principalmente para permitir el cambio de nombre de archivos / carpetas utilizando expresiones regulares. Pero tiene una funcionalidad adicional que puede resolver este problema.
JREN.BAT es un script puro (lote híbrido / JScript) que se ejecuta de forma nativa en cualquier máquina Windows desde XP en adelante, no se requiere un archivo exe de terceros. La documentación completa está disponible al ejecutar
jren /?
desde el símbolo del sistema (ojren /??
para ayuda paginada)Lo siguiente proporcionará la misma funcionalidad que su secuencia de comandos, excepto que mostrará correctamente la marca de tiempo como UTC.
La salida estará en formato ISO 8601, sin puntuación, que se ordenará correctamente cronológicamente utilizando semántica de cadenas. Algo así como
20161006T155621.746+0000
.Puede agregar fácilmente la opción fmt: a la llamada ts () para formatear la marca de tiempo de la forma que mejor le parezca. Utilícelo
jren /?ts()
para obtener ayuda completa sobre todas las opciones disponibles para trabajar con marcas de tiempo.Es muy simple usar JREN para proporcionar una lista completa de directorios con tiempos UTC.
A continuación se enumeran la última marca de tiempo, tamaño de archivo y nombre de archivo modificados para todos los archivos .txt que comienzan
t
en el directorio actual.JREN usa WMI para obtener la última marca de tiempo modificada, que es bastante lenta. Dependiendo de la configuración de su idioma, puede usar
fsomodified
, en lugar demodified
, obtener la marca de tiempo usando FileSystemObject. Esto es mucho más rápido, pero no proporciona milisegundos, y solo funciona si su lenguaje formatea las cadenas de marca de tiempo de una manera que pueda ser interpretada por el objeto de fecha JScript.fuente
Es posible con un lote puro, aunque podría ser lento para una gran cantidad de archivos. Las rutinas por lotes se derivan de funciones de Richie Lawrence Batch Function Library.
Da esta salida
HTH
fuente