it-swarm.it

Come ottengo il tempo corrente sulla riga di comando di Windows, in un formato adatto per l'uso in un nome file?

Aggiornamento: Ora che è il 2016, userò PowerShell per questo a meno che non ci sia un motivo davvero convincente per la retrocompatibilità, in particolare a causa del problema delle impostazioni regionali con l'utilizzo di date. Vedi @ npocmaka's https://stackoverflow.com/a/19799236/8479


Cosa sono le istruzioni da riga di comando di Windows che posso utilizzare per ottenere l'ora corrente in un formato che posso inserire in un nome file?

Voglio avere un file .bat che comprima una directory in un archivio con la data e l'ora correnti come parte del nome, ad esempio Code_2008-10-14_2257.Zip. C'è un modo semplice per farlo, indipendentemente dalle impostazioni regionali della macchina?

Non mi interessa il formato della data, idealmente sarebbe yyyy-mm-dd, ma qualsiasi cosa semplice va bene.

Finora ho questo, che sulla mia macchina mi dà Tue_10_14_2008_230050_91:

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new Zip file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.Zip Code

Posso vivere con questo, ma sembra un po 'goffo. Idealmente sarebbe più breve e avere il formato menzionato in precedenza.

Sto usando Windows Server 2003 e Windows XP Professional. Non voglio installare utilità aggiuntive per raggiungere questo obiettivo (anche se mi rendo conto che ci sono alcune che faranno una bella formattazione delle date).

498
Rory

VedereFile batch di Windows (.bat) per ottenere la data corrente nel formato MMGGAAAA:

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

Se si preferisce l'ora in formato militare/24 ore, è possibile sostituire la seconda riga FOR con questo:

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

C:>.\Date.bat
2008-10-14_0642

Se si desidera che la data sia indipendente dall'ordine giorno/mese della regione, è possibile utilizzare "WMIC os GET LocalDateTime" come origine, poiché è nell'ordine ISO:

@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]

C:> test.cmd
La data locale è [2012-06-19 10: 23: 47.048]

637
Jay

Analisi del tempo di data indipendente dalla regione

Il formato di output di %DATE% e del comando dir è regionalmente dipendente e quindi né robusto né intelligente. date.exe (parte di UnxUtils ) fornisce qualsiasi informazione di data e ora in qualsiasi formato pensabile. È inoltre possibile estrarre le informazioni di data/ora da qualsiasi file con date.exe.

Esempi: (in uno script cmd utilizzare %% anziché%)

date.exe +"%Y-%m-%d"
2009-12-22

date.exe +"%T"
18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503: qualsiasi testo

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Testo: 09/12/22-qualsiasi testo-18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18:55:03" `

Le informazioni di data/ora da un file di riferimento:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Usarlo in uno script CMD per ottenere informazioni su anno, mese, giorno, ora:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Usarlo in uno script CMD per ottenere un timestamp in qualsiasi formato richiesto:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

Estrazione delle informazioni di data/ora da qualsiasi file di riferimento.

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Aggiungendo a un file le informazioni sulla data/ora:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe è parte degli _ liberi GNU tools che non richiedono installazione.

NOTA: Copiare date.exe in qualsiasi directory che si trova nel percorso di ricerca può causare il fallimento di altri script che utilizzano il comando date integrato di Windows.

100
Uri Liebeskind

Altri due modi che non dipendono dalle impostazioni dell'ora (entrambi presi da : come ottenere dati/tempo indipendentemente dalla localizzazione: ). Ed entrambi ottengono anche il giorno della settimana e nessuno di questi richiede autorizzazioni di amministratore !:

  1. MAKECAB- funzionerà su OGNI sistema Windows (veloce, ma crea un piccolo file temporaneo) (lo script foxidrive):

    @echo off
    pushd "%temp%"
    makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
    for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
       set "current-date=%%e-%%b-%%c"
       set "current-time=%%d"
       set "weekday=%%a"
    )
    del ~.*
    popd
    echo %weekday% %current-date% %current-time%
    pause
    

    Ulteriori informazioni sulla funzione di aggiornamento .

  2. ROBOCOPY- non è un comando nativo per Windows XP e Windows Server 2003, ma può essere scaricato dal sito di Microsoft . Ma è integrato in tutto, da Windows Vista e sopra:

    @echo off
    setlocal
    for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
     set "dow=%%D"
     set "month=%%E"
     set "day=%%F"
     set "HH=%%G"
     set "MM=%%H"
     set "SS=%%I"
     set "year=%%J"
    )
    
    echo Day of the week: %dow%
    echo Day of the month : %day%
    echo Month : %month%
    echo hour : %HH%
    echo minutes : %MM%
    echo seconds : %SS%
    echo year : %year%
    endlocal
    

    E altri tre modi che utilizzano altri linguaggi di script di Windows. Ti daranno più flessibilità, ad es. puoi ottenere la settimana dell'anno, il tempo in millisecondi e così via.

  3. JScript/batch hybrid (deve essere salvato come .bat). JScript è disponibile su tutti i moduli di sistema NT e successivi, come parte di Windows Script Host ( sebbene possa essere disabilitato tramite il registro è un caso raro ):

    @if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
    
    @echo off
    cscript //E:JScript //nologo "%~f0"
    exit /b 0
    *------------------------------------------------------------------------------*/
    
    function GetCurrentDate() {
            // Today date time which will used to set as default date.
            var todayDate = new Date();
            todayDate = todayDate.getFullYear() + "-" +
                           ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
                           ("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
                           ("0" + todayDate.getMinutes()).slice(-2);
    
            return todayDate;
        }
    
    WScript.Echo(GetCurrentDate());
    
  4. VSCRIPT/BATCH hybrid (E 'possibile incorporare ed eseguire VBScript all'interno di un file batch senza usare un file temporaneo?) stesso caso di JScript, ma l'ibridazione non è così perfezionare:

    :sub echo(str) :end sub
    echo off
    '>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
    '& echo current date:
    '& cscript /nologo /E:vbscript "%~f0"
    '& exit /b
    
    '0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
    '1 = vbLongDate - Returns date: weekday, monthname, year
    '2 = vbShortDate - Returns date: mm/dd/yy
    '3 = vbLongTime - Returns time: hh:mm:ss PM/AM
    '4 = vbShortTime - Return time: hh:mm
    
    WScript.echo  Replace(FormatDateTime(Date,1),", ","-")
    
  5. PowerShell - può essere installato su ogni macchina con .NET - download da Microsoft ( v1 , v2 , v3 (solo per Windows 7 e versioni successive)). È installato di default su tutto da Windows 7/Windows Server 2008 e versioni successive:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    

    Per usarlo da un file batch:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Auto-compilato jscript.net/batch (mai visto una macchina Windows senza .NET, quindi penso che sia abbastanza portatile):

    @if (@X)==(@Y) @end /****** silent line that start JScript comment ******
    
    @echo off
    ::::::::::::::::::::::::::::::::::::
    :::       Compile the script    ::::
    ::::::::::::::::::::::::::::::::::::
    setlocal
    if exist "%~n0.exe" goto :skip_compilation
    
    set "frm=%SystemRoot%\Microsoft.NET\Framework\"
    
    :: Searching the latest installed .NET framework
    for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
        if exist "%%v\jsc.exe" (
            rem :: the javascript.net compiler
            set "jsc=%%~dpsnfxv\jsc.exe"
            goto :break_loop
        )
    )
    echo jsc.exe not found && exit /b 0
    :break_loop
    
    
    call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
    ::::::::::::::::::::::::::::::::::::
    :::       End of compilation    ::::
    ::::::::::::::::::::::::::::::::::::
    :skip_compilation
    
    "%~n0.exe"
    
    exit /b 0
    
    
    ****** End of JScript comment ******/
    import System;
    import System.IO;
    
    var dt=DateTime.Now;
    Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
    
  7. Logman Questo non può ottenere l'anno e il giorno della settimana. È relativamente lento e crea anche un file temporaneo e si basa sui timestamp che logman inserisce nei suoi file di registro. Funzionerà su tutto, da Windows XP e versioni successive. Probabilmente non verrà mai usato da nessuno - incluso me - ma è un altro modo ...

    @echo off
    setlocal
    del /q /f %temp%\timestampfile_*
    
    Logman.exe stop ts-CPU 1>nul 2>&1
    Logman.exe delete ts-CPU 1>nul 2>&1
    
    Logman.exe create counter ts-CPU  -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
    Logman.exe start ts-CPU 1>nul 2>&1
    
    Logman.exe stop ts-CPU >nul 2>&1
    Logman.exe delete ts-CPU >nul 2>&1
    for /f "tokens=2 delims=_." %%t in  ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
    
    echo %timestamp%
    echo MM: %timestamp:~0,2%
    echo dd: %timestamp:~2,2%
    echo hh: %timestamp:~4,2%
    echo mm: %timestamp:~6,2%
    
    endlocal
    exit /b 0
    
  8. Un altro modo conWMICche fornisce anche la settimana dell'anno e il giorno della settimana, ma non i millisecondi (per i millisecondi controlla la risposta di foxidrive):

    for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
    echo %day%
    echo %DayOfWeek%
    echo %hour%
    echo %minute%
    echo %month%
    echo %quarter%
    echo %second%
    echo %weekinmonth%
    echo %year%
    
  9. UsandoTYPEPERFcon alcuni sforzi per essere veloce e compatibile con diverse impostazioni della lingua e il più velocemente possibile:

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=")
    set "mon="
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. MSHTAconsente di chiamare i metodi JavaScript simili al metodo JScript mostrato in # 3 sopra. Ricorda che le proprietà dell'oggetto Date di JavaScript che includono i valori del mese sono numerate da 0 a 11, non da 1 a 12. Quindi un valore di 9 significa ottobre.

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.Push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>
    
86
npocmaka

Ecco una variante di alt.msdos.batch.nt che funziona in locale indipendentemente.

Metti questo in un file di testo, ad es. getDate.cmd

-----------8<------8<------------ snip -- snip ----------8<-------------
    :: Works on any NT/2k machine independent of regional date settings
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k))
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    set Today=%'yy'%-%'mm'%-%'dd'% 
    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]

    :EOF
-----------8<------8<------------ snip -- snip ----------8<-------------

Per far sì che il codice funzioni sans error msg's to stderr, ho dovuto aggiungere le virgolette singole per gli assegnamenti di variabile per %% a, %% be %% c. La mia localizzazione (PT) stava causando errori in una fase del loop/parsing in cui cose come "set = 20" venivano eseguite. Le virgolette producono un token (anche se vuoto) per il lato sinistro dell'istruzione di assegnazione.

Lo svantaggio sono i nomi delle variabili locali disordinati: "yy", "mm" e "dd". Ma hey, a chi importa!

42
vMax

Io uso questo (di nuovo non region independent (UK))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
33
Dale Walker

Sfortunatamente questo non è immune alle impostazioni regionali, ma fa quello che vuoi.

set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%

Incredibile il materiale che puoi trovare su Wikipedia .

24
Mark Ransom

Si prega di utilizzare il seguente script per ottenere il giorno corrente nella riga di comando:

echo %Date:~0,3%day
16
sudipto roy

Le prime quattro righe di questo codice ti forniranno le variabili YY GG MM YYYY HH min Sec in Windows XP Professional e versioni successive.

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
16
foxidrive

Un altro modo ( credito ):

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
)

@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%

Nota che entrambe le mie risposte sono ancora dipendenti dall'ordine del giorno e del mese, come determinato dalle impostazioni regionali, non so come ovviare a questo.

15
J c
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.Zip
14
DigiP

Questo non è molto più breve ma potrebbe essere un modo più flessibile ( credit ):

FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%
13
J c

Ecco un modo per ottenere l'ora in un'unica riga:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e

Negli Stati Uniti questo produrrà "yyyy-mm-gg hhmm". Differenti impostazioni regionali genereranno uscite% date% diverse, ma è possibile modificare l'ordine del token.

Se si desidera un formato diverso, modificare l'istruzione echo riorganizzando i token o utilizzando separatori diversi (o non).

9
Matthew Johnson

Basta usare questa linea:

PowerShell -Command "get-date"
8
gdelfino

Risposta breve :

 :: Start - Run , type:
 cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"

 :: click into target media, Ctrl + V to paste the result 

Risposta lunga

    @echo off
    :: START USAGE  ==================================================================
    ::SET THE NICETIME 
    :: SET NICETIME=BOO
    :: CALL GetNiceTime.cmd 

    :: ECHO NICETIME IS %NICETIME%

    :: echo Nice time is %NICETIME%
    :: END USAGE  ==================================================================

    echo set hhmmsss
    :: this is Regional settings dependant so Tweak this according your current settings
    for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c 
    ::DEBUG ECHO hhmmsss IS %hhmmsss%
    ::DEBUG PAUSE
    echo %yyyymmdd%
        :: this is Regional settings dependant so Tweak this according your current settings
    for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set  yyyymmdd=%%F%%E%%D
    ::DEBUG ECHO yyyymmdd IS %yyyymmdd%
    ::DEBUG PAUSE


    set NICETIME=%yyyymmdd%_%hhmmsss%
    ::DEBUG echo THE NICETIME IS %NICETIME%

    ::DEBUG PAUSE
8
Yordan Georgiev

La soluzione di Matthew Johnson one-liner per ottenere la data e l'ora di one-liner è eloquente e utile.

Tuttavia necessita di una semplice modifica per lavorare all'interno di un file batch:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
7
John Langstaff

Ed ecco un file batch simile per la parte del tempo.

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional time settings
::
:: Gets the time in ISO 8601 24-hour format
::
:: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that.
:: Since ISO 8601 does not care about AM/PM, we use %time%
::
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do (
      set 'hh'=%%i
      set 'mm'=%%j
      set 'ss'=%%k
      set 'ff'=%%l)
    ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'%

    ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%]
    set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction%
    echo %timestring%

    :EOF

--jeroen

Ho cambiato la risposta con il file batch da vMax quindi funziona anche con la lingua olandese.
Gli olandesi - persistenti come siamo - hanno alcune modifiche nel %date%, date/t e date che interrompono il file batch originale.

Sarebbe bello se alcune persone potessero controllarlo anche contro altre versioni locali di Windows e riportare i risultati.
Se il file batch non funziona nella tua posizione, ti preghiamo di includere l'output di queste due istruzioni sul comando Prompt:
echo:^|date
date/t

Questo è un esempio dell'output che dovresti ottenere dal file batch:

C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103

Ecco il codice revisionato con commenti sul perché:

:: https://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by [email protected] for Dutch locale
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
::            set '%%c'=%%k
::            set 'yy'=%%k
::
:: In addition, date will display the current date before the input Prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
::        if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
    set v_day=
    set v_month=
    set v_year=

    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::DEBUG echo toks=%toks%
      for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
        if "%%a" GEQ "A" (
          for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
            set '%%a'=%%i
            set '%%b'=%%j
            set 'yy'=%%k
          )
        )
      )
      if %'yy'% LSS 100 set 'yy'=20%'yy'%
      set Today=%'yy'%-%'mm'%-%'dd'%

    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
    set datestring=%V_Year%%V_Month%%V_Day%
    echo %datestring%

    :EOF

--jeroen

Una funzione basata su wmic:

:Now  -- Gets the current date and time into separate variables
::    %~1: [out] Year
::    %~2: [out] Month
::    %~3: [out] Day
::    %~4: [out] Hour
::    %~5: [out] Minute
::    %~6: [out] Second
  setlocal
  for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t
  endlocal & (
    if "%~1" neq "" set %~1=%T:~0,4%
    if "%~2" neq "" set %~2=%T:~4,2%
    if "%~3" neq "" set %~3=%T:~6,2%
    if "%~4" neq "" set %~4=%T:~8,2%
    if "%~5" neq "" set %~5=%T:~10,2%
    if "%~6" neq "" set %~6=%T:~12,2%
  )
goto:eof

Lato superiore: Regione indipendente. Lato negativo: Solo gli amministratori di sistema possono eseguire wmic.exe.

Uso:

call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%

Questo fa eco a una stringa come questa:

2014-01-22 12:51:53

Si noti che i parametri di funzione sono out-Parameters, ovvero, è necessario fornire nomi di variabili anziché valori.

Tutti i parametri sono opzionali, quindi call:Now Y M è una chiamata valida se si desidera solo ottenere l'anno e il mese.

6
Tomalak

Questo è quello che ho usato:

::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z")
SET DT=%date%
SET DT=%DT:/=.%
SET DT=%DT:-=.%

Se desideri ulteriori idee per l'automazione dei backup negli archivi 7-Zip, ho un progetto gratuito/aperto che puoi usare o rivedere per le idee: http://wittman.org/ziparcy/

5
micahwittman

Ho avuto un problema simile. Ho un download giornaliero automatico da un server FTP di un file crittografato. Volevo decodificare il file utilizzando gpg, rinominare il file nella data corrente (formato AAAAMMGG) e rilasciare il file decrittografato in una cartella per il reparto corretto.

Ho passato diversi suggerimenti per rinominare il file in base alla data e non ho avuto fortuna finché non sono incappato in questa semplice soluzione.

for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt

Ha funzionato perfettamente (ad esempio, il nome del file è "2011-06-14.txt").

(Fonte)

4
KChiki

http://sourceforge.net/projects/unxutils/files/

Guardare all'interno del file Zip per qualcosa chiamato "Date.exe" e rinominarlo "DateFormat.exe" (per evitare conflitti).

Inseriscilo nella cartella system32 di Windows.

Ha un sacco di opzioni "Data di uscita".

Per aiuto, usa DateFormat.exe --h

Non sono sicuro di come mettere il suo output in una variabile d'ambiente ... usando SET.

4
Sally

Soluzione indipendente regionale che genera il formato di data ISO:

rem save the existing format definition
for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a
rem set ISO specific format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul:
rem query the date in the ISO specific format 
set ISODATE=%DATE%
rem restore previous format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul:

Cosa potrebbe ancora essere ottimizzato: altri processi potrebbero confondersi se si utilizza il formato della data nel breve periodo mentre viene modificato. Quindi analizzare l'output in base alla stringa di formato esistente potrebbe essere "più sicuro", ma sarà più complicato

3
V15I0N
:: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format
:: - Sets environment variables %_isotime% and %_now% to current time
:: - On failure, clears these environment variables
:: Inspired on -> https://ss64.com/nt/syntax-getdate.html
:: - (cX) 2017 [email protected]
:: - http://stackoverflow.com/questions/203090
@echo off

set _isotime=
set _now=

:: Check that WMIC.exe is available
WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_

if not (%1)==() goto _help
SetLocal EnableDelayedExpansion

:: Use WMIC.exe to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC.exe Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    IF "%%~L"=="" goto  _WMIC_done_
        set _yyyy=%%L
        set _mm=00%%J
        set _dd=00%%G
        set _hour=00%%H
        set _minute=00%%I
        set _second=00%%K
)
:_WMIC_done_

::   1    2     3       4      5      6
:: %%G  %%H    %%I     %%J    %%K    %%L
:: Day  Hour  Minute  Month  Second  Year
:: 27   9     35      4      38      2017

:: Remove excess leading zeroes
        set _mm=%_mm:~-2%
        set _dd=%_dd:~-2%
        set _hour=%_hour:~-2%
        set _minute=%_minute:~-2%
        set _second=%_second:~-2%
:: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep%

:: Set date/time in ISO 8601 format:
        Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second%
:: -> http://google.com/search?num=100&q=ISO+8601+format

if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am
if 1%_hour% LSS 112 goto _skip_12_
    set /a _hour=1%_hour%-12
    set _hour=%_hour:~-2%
    set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm
    :: -> https://ss64.com/nt/if.html
    :: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows
    :: 'if () else ()' will NOT set %_now% correctly !?
:_skip_12_

EndLocal & set _isotime=%_isotime% & set _now=%_now%
goto _out

:_WMIC_MISSING_
echo.
echo WMIC.exe command not available
echo - WMIC.exe needs Administrator privileges to run in Windows
echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe"

:_help
echo.
echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format
echo.
echo    %%_now%%     environment variable set to current date and time
echo    %%_isotime%% environment variable to current time in ISO format
echo    set _today=%%_isotime:~0,10%%
echo.

:_out
:: EOF: GetDate.cmd
2
Adolfo

Data una località nota, per riferimento in forma funzionale. La chiamata ECHOTIMESTAMP mostra come ottenere il timestamp in una variabile (DTS in questo esempio).

@ECHO off

CALL :ECHOTIMESTAMP
GOTO END

:TIMESTAMP
SETLOCAL  EnableDelayedExpansion
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL & SET "%~1=%DTS%"
GOTO :EOF

:ECHOTIMESTAMP
SETLOCAL
    CALL :TIMESTAMP DTS
    ECHO %DTS%
ENDLOCAL
GOTO :EOF

:END

EXIT /b 0

E salvato nel file, timestamp.bat, ecco l'output:

 enter image description here

0
bvj

Con Windows 7, questo codice funziona per me:

SET DATE=%date%
SET YEAR=%DATE:~0,4%
SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
ECHO %YEAR%
ECHO %MONTH%
ECHO %DAY%

SET DATE_FRM=%YEAR%-%MONTH%-%DAY% 
ECHO %DATE_FRM%
0
Frizz1977

Preferisco farlo il più breve possibile, quindi senza mese e anno è sufficiente per l'aggiornamento quotidiano

SET date=%DATE:~0,2%
SET hour=%TIME:~0,2%
SET minute=%TIME:~3,2%
IF "%date:~0,1%"==" " SET date=0%DATE:~1,1%
IF "%hour:~0,1%"==" " SET hour=0%TIME:~1,1%
IF "%minute:~0,1%"==" " SET minute=0%TIME:~1,1%
SET VERSION=%date%%hour%%minute%
ECHO VERSION=%date%%hour%%minute%
VERSION=140105

Quando si arriva alla versione di un'applicazione distribuire in fresco di aggiornamento giornaliero con un costruttore

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140105-fresh']
timeout: "300s"

Con questo sarà più semplice aggiornare automaticamente l'intera applicazione automaticamente

sed -e "s/-[0-9]\{1,\}-fresh/-%VERSION%-local/g" cloudbuild.yaml > tmp.txt 
mv -f tmp.txt cloudbuild.yaml

Il file di output sarà pronto per l'aggiornamento locale senza toccare i nomi dei file

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140117-local']
timeout: "300s"
0
Chetabahana