Come posso ottenere la data / ora corrente sulla riga di comando di Windows in un formato adatto per l'uso in un nome di file / cartella?


540

Aggiornamento: ora che è il 2016 utilizzerei PowerShell per questo a meno che non ci sia un motivo davvero convincente e compatibile con le versioni precedenti, in particolare a causa del problema delle impostazioni regionali con l'utilizzo date. Vedi https://stackoverflow.com/a/19799236/8479 di @npocmaka


Che cos'è una o più istruzioni della riga di comando di Windows che posso usare per ottenere il datetime corrente in un formato che posso inserire in un nome file?

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

Non mi dispiace davvero per il formato della data, idealmente sarebbe yyyy-mm-gg, 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 conviverci, ma sembra un po 'goffo. Idealmente sarebbe più breve e avrebbe 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 alcuni che faranno una buona formattazione della data).


7
Stai creando un backup automatico per il tuo codice? Buon per te! Dovremmo farlo anche noi :)
Andrei Rînea

24
usa le persone PowerShell ...[datetime]::now.tostring("yyyy-MM-dd")
Nacht - Ripristina Monica il

È possibile caricare i file con la data di creazione utilizzando xp_cmdshell in SQL Server? Ho fatto una domanda su StackOverflow, si prega gentilmente di consultare il link @ StackOverflow.com/q/32293517/3327081
kolunar

Risposte:


667

Vedere File batch di Windows (.bat) per ottenere la data corrente nel formato MMDDYYYY :

@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 24 ore / militare, è possibile sostituire la seconda riga FOR con questa:

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

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

Se si desidera la data indipendentemente dall'ordine del giorno / mese della regione, è possibile utilizzare "WMIC os GET LocalDateTime" come origine, poiché è in 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]


44
Per la gente del Regno Unito vorrai For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)per la seconda linea.
Rory,

17
Questa soluzione dipende dalle impostazioni locali, Rory ha fornito l'esempio per il Regno Unito per altre versioni locali in cui la data è il 22-02-2012, è necessario sostituire delims = / con delims = -
Nuno Furtado,

25
Sul mio sistema% TIME% restituisce valori come "0:01:15" e "3:15:12" e il codice %% a %% b nella risposta fornisce uno spazio iniziale come "001" e "315". Per ottenere un hhmm di quattro cifre usa questo: For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))Questo restituisce valori come "0001" e "0315" che preferisco nei miei nomi di file.
twamley,

10
Bella versione del wmiccomando! Finora ho visto solo WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table. Allo stesso modo, per arrivare 20120623-1619nel mio fuso orario di Amsterdam, in una riga:for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%
Arjan,

5
Per me dice%%a was unexpected at this time.
Scott zuz22 Blacklock

109

Analisi dell'ora data indipendente dalla regione

Il formato di output di %DATE%e del dircomando è dipendente dalla regione e quindi non è né robusto né intelligente. date.exe (parte di UnxUtils ) fornisce informazioni sulla data e l'ora in qualsiasi formato pensabile. È inoltre possibile estrarre le informazioni sulla data / ora da qualsiasi file con date.exe.

Esempi: (in uno script cmd usa %% invece di%)

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 sulla 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"

Usandolo 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

Usandolo 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

Estrarre le informazioni sulla 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 fa parte degli strumenti GNU gratuiti che non richiedono installazione.

NOTA: la copia date.exein qualsiasi directory che si trova nel percorso di ricerca potrebbe causare errori negli altri script che utilizzano il datecomando incorporato di Windows .


4
Molto meglio della soluzione stranamente più popolare di cui sopra, ma ho dovuto aggiungere / t per evitare il prompt su Windows 8.1
rainabba,

6
Windows 8.1 integrato date.exesembra essere dipendente dalla locale. Restituisce la data in gg / MM / aaaa sul mio sistema, se fosse indipendente dalla locale mi aspetterei sia MM / gg / aaaa o aaaa-MM-gg. Non credo che questa risposta stia parlando del date.exe incorporato ma di una sua versione di terze parti.
SSS,

1
è indipendente dalla locale se lo si fornisce con il formato desiderato sulla riga di comando
terrinecold

3
Si noti che date.exe (parte di UnxUtils) non è uguale al comando della data di build. Quindi, se devi aggiungere / t, il comando data di Windows viene eseguito. Se qualcosa come date.exe + "% Y-% m-% d" funziona, hai installato UnxUtils correttamente. :-)
just.do.it

È possibile caricare i file con la data di creazione utilizzando xp_cmdshell in SQL Server? Ho provato il comando "forfiles" ma senza risultati. Ho fatto una domanda su StackOverflow, si prega gentilmente di consultare il link @ StackOverflow.com/q/32293517/3327081
kolunar

105

Altri due modi che non dipendono dalle impostazioni dell'ora (entrambe tratte da : Come ottenere dati / ora indipendenti dalla localizzazione:) . Ed entrambi ottengono anche il giorno della settimana e nessuno di essi 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 get-date .

  2. ROBOCOPIA : 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 versioni successive:

    @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 utilizza altri linguaggi di script di Windows. Ti daranno maggiore flessibilità, ad esempio puoi ottenere settimana dell'anno, tempo in millisecondi e così via.

  3. Ibrido JScript / batch (deve essere salvato come .bat). JScript è disponibile su ogni sistema da NT in poi, come parte di Windows Script Host ( anche se può 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. Ibrido VSCRIPT / BATCH ( è possibile incorporare ed eseguire VBScript in un file batch senza utilizzare un file temporaneo? ) Stesso caso di JScript, ma l'ibridazione non è così perfetta:

    :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 che ha .NET - download da Microsoft ( v1 , v2 , v3 (solo per Windows 7 e versioni successive)). È installato per impostazione predefinita 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. Jscript.net/batch autocompilato (mai visto un computer Windows senza .NET, quindi penso che questo 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 Impossibile 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 in poi. 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 con WMIC che 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. Utilizzando TYPEPERF con 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. MSHTA consente di chiamare metodi JavaScript simili al metodo JScript illustrato al punto 3 sopra. Tieni presente che le proprietà dell'oggetto Date di JavaScript che coinvolgono 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>
    

2
per powershell C: \> per / f %% i in ('powershell get-date -format "{yyyyMMdd_HHmmss}"') imposta datetime = %% i C: \> echo% datetime%
Samuel

1
makecab: funziona creando un file chiamato ~.rpte cercando un stringinterno, a cominciare da makecab, che è una linea simile MakeCAB Report: Tue Sep 02 22:15:57 2014. per me questo comando non è localizzato, è indipendente dalla locale. Questo trucco si basa su questo. Speriamo che non lo sarà mai, oppure attenzione!
n611x007,

10
Mi piace il testo di apertura "Altri due ..." seguito da 8 soluzioni.
Adam Smith,

1
Cosa, nessun mshtaibrido? :) Ti dispiace se modifico la tua risposta e ne aggiungo una? Questa sembra essere la migliore raccolta di soluzioni esoteriche e sembra mshtaappartenere qui.
rojo,

1
La soluzione accettata non funzionerebbe per me, qualunque cosa io abbia provato. Molteplici di queste soluzioni hanno funzionato per me. (Lotto e Powershell).
Brett aspetta

44

Ecco una variante da alt.msdos.batch.nt che funziona in modo locale-indipendente.

Inseriscilo in un file di testo, ad esempio 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 funzionare il codice senza errori msg su stderr, ho dovuto aggiungere le virgolette singole per assegnare le assegnazioni delle variabili per %% a, %% b e %% c. La mia locale (PT) stava causando errori in una fase del loop / analisi in cui venivano eseguite cose come "set = 20". Le virgolette producono un token (seppur vuoto) per il lato sinistro dell'istruzione di assegnazione.

Il rovescio della medaglia sono i nomi delle variabili locali disordinate: 'yy', 'mm' e 'dd'. Ma hey, chi se ne frega!


3
Questo è perfetto ed è l'approccio più semplice ed elegante che abbia mai visto.
Doug,

2
Vedi anche i miglioramenti di Jeroen , necessari in quanto non tutti i locali usano le corde dd, mme yynella produzione di echo:^|date.
Arjan,

non funziona su tutti i locali. (In tedesco dateindica Geben Sie das neue Datum ein: (TT-MM-JJ), dove si JJrompe la sceneggiatura (si aspetta YY))
Stephan,

35

Lo uso (di nuovo non indipendente dalla regione (Regno Unito))

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

Vedi le variabili d'ambiente Cmd.exe con Colon e Tilde su questa tecnica poco conosciuta ma molto efficiente. (Un puntatore a un riferimento autorevole di Microsoft sarebbe apprezzato.)
DavidRR

Ecco il riferimento al file batch di Microsoft per Windows XP . Tale riferimento include l' utilizzo dei parametri batch . Sfortunatamente, nessuna discussione sulla tecnica del "taglio".
DavidRR

Questo non funziona abbastanza per me. Forse è qualcosa a che fare con le impostazioni regionali? Ottengo un output di "/ 15 / - 1-We_1009" quando lo eseguo mercoledì 15 ottobre 2014.
Joel B

26

Le prime quattro righe di questo codice ti forniranno variabili affidabili AA GG MM AAAA 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

Perfetto, questa è la soluzione migliore per me, poiché chiamare PS comporterà l'aspetto del testo cmd per apparire divertente.
Ste

25

Purtroppo 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 le cose che puoi trovare su Wikipedia .


1
Mark - Trovate variabili d'ambiente Cmd.exe con Colon e Tilde che descrivono la variabile "slicing" tecnica esposta nella tua risposta. Non trovando più quelle informazioni nell'articolo di Wikipedia. Vorrei trovare un riferimento autorevole da Microsoft.
DavidRR

1
Ecco il riferimento al file batch di Microsoft per Windows XP . Tale riferimento include l' utilizzo dei parametri batch . Sfortunatamente, nessuna discussione sulla tecnica del "taglio".
DavidRR

18

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

echo %Date:~0,3%day

8
Giocato un po 'in giro con questo, è il più corto che ho trovato per ottenere Date and Time: echo% date
%%

15

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 qui fanno ancora affidamento sull'ordine del giorno e del mese determinato dalle impostazioni regionali, non sono sicuro di come aggirare il problema.


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

http://www.dotnetperls.com/7-zip-examplesha alcuni punti positivi potrebbe essere utile per qualcuno in futuro.
Saravanan,

13

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

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%

10

Ecco un modo per ottenere l'ora della data in una sola 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à "aaaa-mm-gg hhmm". Impostazioni internazionali diverse comportano output% date% diversi, ma è possibile modificare l'ordine dei token.

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


C'è un modo per ottenere l'ora in un formato di 12 ore e anche per visualizzare le informazioni AM o PM?
Sangli,


9

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

:: in cmd per / f% i in ('PowerShell -Command "get-date" -format "yyyyMMdd"') imposta yyyyMMdd =% i :: in cmd script per / f %% i in ('PowerShell -Command "get-date" -format "yyyyMMdd" ') imposta yyyyMMdd = %% i
Yordan Georgiev

8

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

Tuttavia ha bisogno di una semplice modifica per funzionare 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

1
Non funziona in CMD (%% a era imprevisto in questo momento) o in PowerShell (apertura mancante '(' dopo la parola chiave per) su Windows 8.1
rainabba,

3
Rainabba, questo è esattamente l'errore che si ottiene quando quel comando viene emesso dalla linea CMD . Tuttavia, " dall'interno di un file batch ", il comando restituisce "30/01/2014 1324".
John Langstaff,

1
o molto più semplice sarebbe senza il ciclo forecho %date:/=-%%time::=-%
Gerhard Barnard,

7

Ed ecco un file batch simile per la parte temporale.

:: 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


Ciao, sono stato in grado di caricare i file in base alla data modificata utilizzando un comando di seguito, z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” ma voglio sapere come caricare i file in base alla data di creazione. Qualsiasi aiuto sarebbe molto apprezzato. È stata posta una domanda su StackOverflow ma nessuna risposta è ancora. Si prega di dare un'occhiata al link per i dettagli stackoverflow.com/q/32293517/3327081~~V~~plural~~3rd
kolunar

1
Fai una nuova domanda a riguardo. Non ho mai usato forfiles.
Jeroen Wiert Pluimers,

7

Ho modificato la risposta con il file batch di vMax in modo che funzioni anche con la lingua olandese.
Gli olandesi - persistenti come siamo - abbiamo alcune modifiche nel %date%, date/tedate che rompere il batch-file originale.

Sarebbe bello se alcune persone potessero verificarlo anche con altre versioni locali di Windows e riportare i risultati.
Se il file batch non riesce nella tua posizione, includi l'output di queste due istruzioni sul prompt dei comandi:
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 rivisto con commenti sul perché:

:: /programming/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 jeroen@pluimers.com 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


2
Alcuni usano prima gli anni o mancano degli zeri iniziali; vedi il formato data di Wikipedia per paese . I francesi potrebbero usare jj-mm-aaaaper jour, mois, annee? Forse gli italiani gg/mm/aaaaper giorno, mese, anno? Tedeschi tt.mm.jjjjper Tag, Monat, Jahr? Ma poi: suppongo che nella maggior parte dei paesi vengano utilizzate solo poche lingue. Come nei Paesi Bassi, infatti, Windows sarà spesso inglese o olandese, non molto altro. Abbastanza buono per me
Arjan,

2
A parte questo: un'altra versione delle funzionalità nascoste dei file batch di Windows è meno perfetta (ha bisogno della correzione per l'olandese jje non impone un anno di 4 cifre), ma usa shiftper scartare il giorno come Mono ma. Solo diverso.
Arjan,

4
Si rompe su un sistema tedesco. Anno e mese di lavoro, ma il giorno fallisce perché "giorno" inizia con una "T" in tedesco ("Tag"), non una "d". La stringa di formato nel prompt è (TT-MM-JJ), l' date/toutput è 23.06.2012. / cc @Arjan
balpha,

2
Un altro a parte: si potrebbe anche ottenere l'ordine dal registro , usando reg query "HKCU\Control Panel\International" /vShortDate. Fai attenzione durante il test: per un prompt dei comandi aperto, modificando l'impostazione del Pannello di controllo cambia anche il formato utilizzato per visualizzare la data (per entrambi datee date /te echo %date%), ma su Windows 7 NON cambia il formato per la nuova data! Come cambiare il mio formato della data breve in YY/MM/dd, mi viene: The current date is: 12/06/23 Enter the new date: (mm-dd-yy). L'apertura di un nuovo prompt dei comandi risolve questo problema.
Arjan,

2
@Arjan dovrebbe essere reg query "HKCU\Control Panel\International" /v sShortDate.
tricasse

6

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 automatizzare i backup negli archivi 7-Zip, ho un progetto gratuito / aperto che puoi utilizzare o rivedere per idee: http://wittman.org/ziparcy/


Nel mio sistema% date% contiene "Mar 14/10/2008". Quindi, dovrai comunque tagliare (o altrimenti gestire) il "Mar" e il personaggio spaziale.
BoltBait,

Ciao @micahwittman. È possibile caricare i file con la data di creazione utilizzando xp_cmdshell in SQL Server? Ho provato il comando "forfiles" ma senza risultati. Ho fatto una domanda su StackOverflow, si prega gentilmente di consultare il link @ StackOverflow.com/q/32293517/3327081
kolunar

5

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

Ho seguito diversi suggerimenti per rinominare il file in base alla data e non ho avuto fortuna fino a quando non mi sono imbattuto in questa semplice soluzione.

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

Ha funzionato perfettamente (ovvero, il nome del file viene visualizzato come "2011-06-14.txt").

(Fonte)


5

Una funzione che si basa 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

Upside: indipendente dalla regione. Unico inconveniente : 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 echo una stringa come questa:

2014-01-22 12:51:53

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

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


4

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

Cerca nel file ZIP qualcosa chiamato "Date.exe" e rinominalo "DateFormat.exe" (per evitare conflitti).

Inseriscilo nella cartella system32 di Windows.

Ha molte opzioni di "uscita della data".

Per aiuto, usa DateFormat.exe --h

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


1
Grazie, anche se questa domanda è specifica per farlo senza scaricare strumenti aggiuntivi.
Rory,

3

Soluzione indipendente regionale che genera il formato 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 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


è possibile registrare query iDate ( technet.microsoft.com/en-us/library/cc978637.aspx ) e procedere in modo condizionale (3 valori possibili in base a technet) - sebbene non lo abbia ancora provato.
Vincent De Smet,

2
:: 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 adolfo.dimare@gmail.com
:: - 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

0

Data una località nota, per riferimento in forma funzionale. La ECHOTIMESTAMPchiamata mostra come ottenere il timestamp in una variabile ( DTSin 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 su file, timestamp.bat, ecco l'output:

inserisci qui la descrizione dell'immagine


Sembra che questo abbia a che fare con il problema regionale: non funziona su tutte le macchine inglesi.

Non sorpreso, @SteveFest. Se fosse possibile impostare temporaneamente le impostazioni internazionali, ciò potrebbe aiutare a fornire una soluzione globale, ma sembra che sia necessario conoscere la regione in anticipo. La tua lingua è en-US o en-SomewhereElse?
bvj

@SteveFest Suppongo che sarebbe possibile creare un elenco di locali in cui ciascuno include espressioni di data / ora con un campione da convalidare. Sono super impegnato, ma proverò ad aggiornare la mia risposta per illustrare. Potresti mostrarmi campioni delle uscite di data / ora di HK? Potrei assurdamente supporre che zh-HK stampi cifre a offset fissi.
bvj,

zh-HK: (yy)yy年m月d日 hh:mm- nessuno zero iniziale. (yy) potrebbe essere ignorato poiché abbiamo un anno a 2 cifre o un anno a 4 cifre. Ma tieni presente una cosa: il formato della data e dell'ora può essere modificato per macchina.

Grazie @SteveFest, ti seguirò tra qualche settimana. Corri systeminfoalla CLI e fammi sapere cosa vedi System Locale. L'esecuzione del programma richiede tempo, ma forse il risultato della localizzazione potrebbe essere memorizzato nella cache e successivamente utilizzato per indicizzare un formato data / ora.
bvj,

0

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%

E di nuovo. È bello che funzioni sulla tua macchina, ma hai perso il puntoindependent of the regional settings of the machine
jeb

-1

Prendo atto che l'o / p non ha richiesto una soluzione indipendente dalla regione. La mia soluzione è per il Regno Unito però.

Questa è la soluzione più semplice possibile, una soluzione a 1 riga, da utilizzare in un file batch:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%

2
Ha menzionato una soluzione indipendente dalla regione ...particularly because of the regional settings issue with using date. Btw. La tua soluzione è la stessa delle altre venti risposte.
jeb

Sì, ma il mio potrebbe effettivamente (facoltativamente) essere utilizzato dalla riga di comando. Qual è il merito di pubblicare 35 righe di codice, se una riga di codice fornirà la stessa soluzione?
Ed999,

Non riesco a vedere alcuna differenza rilevante rispetto alle vecchie risposte di @Matthew Johnson, 2010 o @KChiki, 2011
jeb

anche se questa risposta non è corretta, per commentare l'effettiva risposta, qui non è necessario un ciclo for quando potresti semplicemente averlo fattoecho %date:/=-%
Gerhard Barnard

No. Se si omette il ciclo FOR, non è possibile creare variabili e la data che si è presa la briga di estrarre è ancora inutile. Con il ciclo FOR, le variabili create dal ciclo sono disponibili per l'uso in altre parti dello script. Deprezzo fortemente l'utilizzo di dozzine di righe di codice per creare il ciclo FOR, quando è richiesta solo 1 riga. E disapprovo fortemente la pubblicazione di soluzioni non a riga di comando, in cui l'o / p ha specificamente richiesto una soluzione a riga singola da utilizzare nella riga di comando.
Ed999,

-3

So che sono già stati menzionati numerosi modi. Ma ecco il mio modo di scomporlo per capire come è fatto. Speriamo che sia utile per qualcuno a cui piace il metodo passo dopo passo.

:: Check your local date format
echo %date%

    :: Output is Mon 08/15/2016

:: get day (start index, number of characters)
::         (index starts with zero)
set myday=%DATE:~0,4%
echo %myday%
    :: output is Mon 

:: get month
set mymonth=%DATE:~4,2%
echo %mymonth%
    :: output is 08

:: get date 
set mydate=%DATE:~7,2% 
echo %mydate%
    :: output is 15

:: get year
set myyear=%DATE:~10,4%
echo %myyear%
    :: output is 2016

3
Hai perso il puntoindependent of the regional settings of the machine
jeb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.