2012-07-08 51 views
11

Por lo que sé, Lote no tiene un comando que le dé tiempo a UNIX. El más cercano que puedo encontrar es %time%, que solo muestra la marca de tiempo.Lote: Marca de tiempo a UNIX Tiempo

¿Hay algún comando o conjunto de comandos en el lote con el que pueda obtener la hora de UNIX?

+0

posible duplicado de [lo que es el equivalente ventanas del comando "date +% s"] (http://stackoverflow.com/questions/11124572/ what-is-the-windows-equivalent-of-the-command-dates) – dbenham

+0

@dbenham De hecho, un duplicado, pasé por alto tu solución. –

+0

descargar un GNU date.exe (del archivo GnuWin32, MinGW, Cygwin) sería útil. –

Respuesta

18

Hay Richie Lawrence's batch library que tiene todos esos scripts útiles e ingeniosos. El que necesita es DateToSec (que usa GetDate y GetTime).

Así es un guión simplificado, que emplea un poco WMI:

@echo off 
setlocal 
call :GetUnixTime UNIX_TIME 
echo %UNIX_TIME% seconds have elapsed since 1970-01-01 00:00:00 
goto :EOF 

:GetUnixTime 
setlocal enableextensions 
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do (
    set %%x) 
set /a z=(14-100%Month%%%100)/12, y=10000%Year%%%10000-z 
set /a ut=y*365+y/4-y/100+y/400+(153*(100%Month%%%100+12*z-3)+2)/5+Day-719469 
set /a ut=ut*86400+100%Hour%%%100*3600+100%Minute%%%100*60+100%Second%%%100 
endlocal & set "%1=%ut%" & goto :EOF 

El resultado será devuelto en el primer parámetro pasado a GetUnixTime, es decir %UNIX_TIME%.
Por ejemplo:

1341791426 seconds have elapsed since 1970-01-01 00:00:00 

espero que ayude!

+3

Esta es una buena respuesta, pero parece que encontré un error en el código . Durante los primeros dos meses del año, los resultados son de dos años en el futuro. Donde tienes '4800 + z', creo que necesitas' 4800-z'. Consulte el código DateToSecs original de Richie Lawrence. Si tienes tiempo, verifica mi corrección (y edita tu publicación). – jimhark

+0

@jimhark Tienes razón. ¡Gracias por la corrección! –

+3

Bueno. Gracias. He hecho otro cambio en mi copia. No es realmente un error, pero pensé en compartirlo contigo. Saqué este código para tratar de entenderlo completamente. Descubrí que no necesitas agregar 4800 si cambias '-2472633' a' -719469'. Simplemente hace retroceder un ajuste que no es necesario aquí. Entonces termina con las dos líneas que terminan con '10000% Year %%% 10000-z' y' Day-719469'. No es una gran diferencia, pero ahora es más fácil explicar lo que es 719469, es el número de días en 1970 años, utilizado para adaptarse a la época. – jimhark

0

No hay un comando por lotes para devolver la hora de UNIX. Sus únicas opciones serían escribir un programa que podría ejecutarse desde un archivo por lotes que devolvería la hora de UNIX, o podría usar Windows PowerShell.

+0

Sorprendentemente, hay _es_ una manera discontinua ... ver mi respuesta. –

+0

Me disculpo>. < – ctor

+1

por el comando powershell equivalente sería 'get-date -uformat% s' (o' powershell -command get-date -uformat% s' para llamarlo desde cmd/lote – wmz

0

La mejor solución es, por lejos, descargar un unix-port independiente de fecha.

Recomiéndenle que cambie el nombre a unixdate.exe, para evitar conflictos con el comando MS Date.

obtenerlo de here

  1. descarga & de descompresión. Hasta donde yo sé, todas las utilidades son 'portátiles', es decir, no requieren ningún programa de instalación para que funcionen. Solo he usado algunos (rm.exe & date.exe). también, puede cambiar el nombre del exe en caso de que puedan coincidir con otro sistema de utilidades que ya tienen
  2. Encuentra los puertos reales ejecutables en la subcarpeta (usr \ \ wbin local)
  3. para obtener información AYUDA escriba el comando seguido --help (debe precisar ayuda en minúsculas)

Ejemplo:

((PROMPT)):unixdate +%Y%M%d 
20141704 

((PROMPT)):unixdate +%Y%b%d 
2014Sep04 
+0

'20141704'? '17'? ¿Octubre? – Stephan

2

¿Qué pasa con sencillo programa C de largo la línea 1 de regresar marca de tiempo UNIX? Puede recuperar el valor de% errorlevel% en el script por lotes.

#include <stdio.h> 
#include <time.h> 

int main(void) 
{ 
    return (int) time(NULL); 
} 

En mi prueba en el símbolo de sistema funcionó:

C:\Users\dabaran\Desktop\cs50\src\C>.\time || echo %errorlevel% && set mytstamp=%errorlevel% 
1419609373 

C:\Users\dabaran\Desktop\cs50\src\C>echo %mytstamp% 
1419609373 
5

crear un archivo llamado "getUtime.bat"

@echo off 
echo WScript.Echo(new Date().getTime()); > %temp%\time.js 
cscript //nologo %temp%\time.js 
del %temp%\time.js 

y llame como esto

"C:\>getUTime" 
1430894237616 
Cuestiones relacionadas