2012-07-08 10 views
11

Per quanto ne so, Batch non ha un comando che dà il tempo UNIX. Il più vicino che riesco a trovare è %time%, che visualizza solo il timestamp.Batch: Timestamp a UNIX Time

Esiste un comando o un insieme di comandi in Batch con cui è possibile ottenere l'ora UNIX?

+0

possibile duplicato di [ciò che è l'equivalente di Windows del comando "date +% s"] (http://stackoverflow.com/questions/11124572/ what-is-the-windows-equivalent-of-the-date-date) – dbenham

+0

@dbenham Effettivamente un duplicato, ho trascurato la tua soluzione –

+0

scaricare un file GNU date.exe (da GnuWin32, MinGW, Cygwin) sarebbe utile. –

risposta

18

C'è Richie Lawrence's batch library che contiene tutti quegli script utili. Quello di cui hai bisogno è DateToSec (che utilizza GetDate e GetTime).

Ecco uno script semplificata, che impiega un po 'di 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 

Il risultato verrà restituito nel primo parametro passato a GetUnixTime, vale a dire %UNIX_TIME%.
Per esempio:

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

Speranza che aiuta!

+3

Questa è una buona risposta, ma mi sembra di aver trovato un bug nel codice . Per i primi due mesi dell'anno, i risultati saranno due anni nel futuro. Dove hai '4800 + z', penso che tu abbia bisogno di' 4800-z'. Fare riferimento al codice DateToSecs originale di Richie Lawrence. Se hai tempo, verifica la mia correzione (e modifica il tuo post). – jimhark

+0

@jimhark Hai ragione. Grazie per la correzione! –

+3

Buono. Grazie. Ho fatto un altro cambiamento nella mia copia. Non è davvero un bug, ma ho pensato di condividerlo con te. Ho preso questo codice a parte per cercare di capirlo appieno. Ho capito che non è necessario aggiungere 4800 se si cambia '-2472633' in' -719469'. Si limita a eseguire un aggiustamento che non è necessario qui. Quindi finisci con le due righe che terminano con '10000% Year %%% 10000-z' e' Day-719469'. Non una grande differenza, ma ora è più facile spiegare cos'è 719469, è il numero di giorni negli anni 1970, usato per adattarsi all'epoca. – jimhark

0

Non esiste un comando batch per la restituzione dell'ora UNIX. Le tue uniche opzioni sarebbero scrivere un programma che potrebbe essere eseguito da un file batch che restituirebbe l'ora UNIX, oppure potresti utilizzare Windows PowerShell.

+0

Sorprendentemente, c'è un modo batch ... vedi la mia risposta –

+0

Mi scuso>. < – ctor

+1

per comando equivalente di PowerShell sarebbe 'get-date -uformat% s' (o' powershell -command get-date -uformat% s' per chiamarlo da cmd/batch – wmz

0

La soluzione di gran lunga migliore è scaricare un unix-port di data.exe indipendente.

Si consiglia di rinominarlo in unixdate.exe, per evitare conflitti con il comando Data MS.

garantita da here

  1. scaricare & unzip. Per quanto ne so, tutte le utilità sono "portatili", cioè non richiedono alcun programma di installazione per farle funzionare. Ho usato solo alcuni (rm.exe & date.exe). Inoltre, è possibile rinominare l'exe nel caso in cui potrebbero corrispondere altro sistema utils che già hanno
  2. Trova le porte effettivamente eseguibili nella sottocartella (usr \ \ wbin locale)
  3. Per ottenere informazioni AIUTO digitare il comando seguito con --help (deve precisare aiuto in minuscolo)

Esempio:

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

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

'20141704'? '17' ?? Octember ??? – Stephan

2

Che dire semplice programma C lungo la linea 1 ritorno timestamp UNIX? È possibile recuperare il valore da% errorlevel% nello script batch.

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

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

Nella mia prova al prompt dei comandi ha funzionato:

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

generare una lima chiamata "getUtime.bat"

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

e chiamare come questo

"C:\>getUTime" 
1430894237616