salvar - variavel dia da semana windows




Como faço para obter datetime atual na linha de comando do Windows, em um formato adequado para usar em um nome de arquivo? (18)

Análise de tempo de data regionalmente independente

O formato de saída de %DATE% e do comando dir é regionalmente dependente e, portanto, não é robusto nem inteligente. date.exe (parte do UnxUtils ) fornece qualquer informação de data e hora em qualquer formato pensável. Você também pode extrair as informações de data / hora de qualquer arquivo com date.exe .

Exemplos: (em um script cmd use %% em vez de%)

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

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Texto: 09/12/22-qualquer texto-18,55

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

A informação de data / hora de um arquivo de referência:
date.exe -rc:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Usá-lo em um script CMD para obter informações de ano, mês, dia e horário:

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

Usando-o em um script CMD para obter um registro de data e hora em qualquer formato necessário:

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

Extrair as informações de data / hora de qualquer arquivo de referência.

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

Adicionando a um arquivo suas informações de data / hora:

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 faz date.exe que não precisam de instalação.

NOTA: A cópia de date.exe em qualquer diretório que esteja no caminho de pesquisa pode causar a falha de outros scripts que usam o comando de date date.exe do Windows.

Atualização: agora que é 2016, eu usaria o PowerShell para isso, a menos que haja um motivo muito atraente e retrógrado, especialmente devido ao problema de configurações regionais com o uso da date . Veja @ npocmaka's https://stackoverflow.com/a/19799236/8479

O que é uma instrução de linha de comando do Windows que posso usar para obter a datetime atual em um formato que eu possa colocar em um nome de arquivo?

Eu quero ter um arquivo .bat que fecha um diretório em um arquivo com a data e hora atual como parte do nome, por exemplo, Code_2008-10-14_2257.zip . Existe alguma maneira fácil de fazer isso, independente das configurações regionais da máquina?

Eu realmente não me importo com o formato de data, idealmente, seria aaaa-mm-dd, mas qualquer coisa simples é bom.

Até agora eu tenho isso, que na minha máquina me 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

Eu posso viver com isso, mas parece um pouco desajeitado. Idealmente, seria mais breve e ter o formato mencionado anteriormente.

Estou usando o Windows Server 2003 e o Windows XP Professional. Eu não quero instalar utilitários adicionais para conseguir isso (embora eu perceba que há alguns que farão formatação de data legal).


Apenas use esta linha:

PowerShell -Command "get-date"

Aqui está uma variante do alt.msdos.batch.nt que funciona localmente de forma independente.

Coloque isso em um arquivo de texto, por exemplo, 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<-------------

Para fazer com que o código trabalhe sem erros msg para stderr, eu tive que adicionar as aspas simples para atribuir as atribuições de variáveis ​​para %% a, %% be %% c. Minha localidade (PT) estava causando erros em um estágio no loop / parsing onde coisas como "set = 20" estavam sendo executadas. As cotações geram um token (embora vazio) para o lado esquerdo da instrução de atribuição.

A desvantagem são os nomes de variável de localidade confusos: 'yy', 'mm' e 'dd'. Mas ei, quem se importa!


As quatro primeiras linhas deste código fornecerão variáveis ​​confiáveis ​​de MMY YYYY HH Min Sec no Windows XP Professional e superior.

@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

Eu mudei a resposta com o arquivo de lote do para que ele funcione com o idioma holandês também.
Os holandeses - persistentes como nós - têm algumas alterações na %date% , date/t e date que quebram o arquivo batch original.

Seria bom se algumas pessoas pudessem verificar isso também em outras localidades do Windows e relatar os resultados.
Se o arquivo em lote falhar em sua localização, inclua a saída dessas duas instruções no prompt de comando:
echo:^|date
date/t

Esta é uma amostra da saída que você deve obter do arquivo em lote:

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

Aqui está o código revisado com comentários sobre o motivo:

:: https://.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


Eu uso isso (novamente não independente da região (UK))

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

Isso não é realmente mais breve, mas pode ser uma maneira mais flexível ( crédito ):

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%

Mais duas maneiras que não dependem das configurações de tempo (ambas tiradas de : Como obter dados / tempo independentes da localização:) . E ambos também recebem o dia da semana e nenhum deles requer permissões de administrador !:

  1. MAKECAB - funcionará em CADA sistema Windows (rápido, mas cria um pequeno arquivo temporário) (o 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
    

    Mais informações sobre a função de atualização .

  2. ROBOCOPY - não é um comando nativo para Windows XP e Windows Server 2003, mas pode ser baixado do site da Microsoft . Mas está embutido em tudo do Windows Vista e acima:

    @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 mais três maneiras que usam outras linguagens de script do Windows. Eles vão te dar mais flexibilidade, por exemplo, você pode obter semana do ano, tempo em milissegundos e assim por diante.

  3. JScript / lote híbrido (precisa ser salvo como .bat ). JScript está disponível em todos os formulários do sistema NT e acima, como parte do Windows Script Host ( embora possa ser desativado através do registro, é um 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 híbrido ( é possível incorporar e executar o VBScript dentro de um arquivo em lotes sem usar um arquivo temporário? ) Mesmo caso do JScript, mas a hibridização não é tão perfeita:

    :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 - pode ser instalado em todas as máquinas que tenham o .NET - download da Microsoft ( v1 , v2 , v3 (somente para o Windows 7 e superior)). Ele é instalado por padrão em tudo do Windows 7 / Windows Server 2008 e acima:

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

    Para usá-lo de um arquivo em lotes:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Auto-compilado jscript.net/batch (nunca vi uma máquina Windows sem .NET, então acho que isso é bem portátil):

    @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 Isso não pode obter o ano e o dia da semana. Ele é comparativamente lento e também cria um arquivo temporário e é baseado nos timestamps que o logman coloca em seus arquivos de log. Ele funcionará em tudo, desde o Windows XP e acima. Provavelmente nunca será usado por ninguém - inclusive eu - mas é mais uma forma ...

    @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. Mais uma maneira com WMIC que também dá semana do ano e o dia da semana, mas não os milissegundos (por milissegundos verifique a resposta do 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. Usando o TYPEPERF com alguns esforços para ser rápido e compatível com diferentes configurações de idioma e o mais rápido possível:

    @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. O MSHTA permite chamar métodos JavaScript semelhantes ao método JScript demonstrado no item 3 acima. Lembre-se de que as propriedades do objeto Date do JavaScript que envolvem valores de mês são numeradas de 0 a 11, não de 1 a 12. Portanto, um valor de 9 significa outubro.

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

Por favor, use o seguinte script para obter o dia atual na linha de comando:

echo %Date:~0,3%day

Resposta curta :

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

Resposta longa

    @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

Veja o arquivo de lote do Windows (.bat) para obter a data atual no formato MMDDAAA :

@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 preferir o tempo no formato 24 horas / militar, pode substituir a segunda linha FOR por:

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

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

Se você quiser a data independentemente da ordem dia / mês da região, você pode usar "WMIC os GET LocalDateTime" como fonte, já que está na ordem 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
A data local é [2012-06-19 10: 23: 47.048]


date.exe

Olhe dentro do arquivo ZIP para algo chamado "Date.exe" e renomeie-o "DateFormat.exe" (para evitar conflitos).

Coloque-o na sua pasta system32 do Windows.

Tem um monte de opções de "data de saída".

Para ajuda, use DateFormat.exe --h

Não tenho certeza de como você colocaria sua saída em uma variável de ambiente ... usando SET.


Com o Windows 7, esse código funciona para mim:

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%

Isso é o que eu usei:

::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 você quiser mais idéias para automatizar backups em arquivos 7-Zip, eu tenho um projeto livre / aberto que você pode usar ou revisar para obter idéias: http://wittman.org/ziparcy/


Dada uma localidade conhecida, por referência em forma funcional. A ECHOTIMESTAMPchamada mostra como obter o registro de data e hora em uma variável ( DTSneste exemplo).

@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 salvo no arquivo, timestamp.bat, aqui está a saída:


Eu sei que existem várias maneiras mencionadas já. Mas aqui está a minha maneira de entender como isso é feito. Espero que seja útil para alguém que goste do método passo a 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

Observo que o o / p não solicitou uma solução independente da região. Minha solução é para o Reino Unido embora.

Esta é a solução mais simples possível, uma solução de 1 linha, para uso em um arquivo em lote:

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

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




batch-file