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

Atualização: agora que é 2016, eu usaria o PowerShell para isso, a menos que haja uma razão realmente atraente e retrógrada, 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 eu posso usar para obter o 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 saiba que há alguns que farão uma formatação de data legal).

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 você preferir o horário no formato 24 horas / militar, pode replace 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]

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 

Extraindo 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 parte das ferramentas gratuitas do GNU que não precisam de instalação.

NOTA: Copiar date.exe para 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.

Mais duas maneiras que não dependem das configurações de hora (ambas tiradas de : Como obter dados / tempo independentes da localização:) . E ambos também recebem o dia da semana e nenhum deles exige permissions 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 function 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 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 o .NET, então eu 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. É comparativamente lento e também cria um arquivo temporário e é baseado nos carimbos de hora 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 methods JavaScript semelhantes ao método JScript demonstrado no item 3 acima. Tenha em mente que as propriedades do object 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.

       

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 variables ​​para %% a, %% b e %% c. Minha localidade (PT) estava causando erros em um estágio no loop / parsing onde coisas como "set = 20" estavam sendo executadas. As cotas geram um token (embora vazio) para o lado esquerdo da instrução de atribuição.

A desvantagem são os nomes das variables ​​do código de idioma: 'yy', 'mm' e 'dd'. Mas ei, quem se importa!

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

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

Infelizmente isso não é imune a configurações regionais, mas faz o que você quer.

 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% 

Incrível o material que você pode encontrar na Wikipedia .

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

 echo %Date:~0,3%day 

As primeiras quatro linhas deste código fornecerão variables ​​confiáveis ​​YY DD MM AAAA 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 

Outra maneira ( crédito ):

 @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% 

Observe que minhas duas respostas aqui ainda dependem da ordem do dia e do mês, conforme determinado pelas configurações regionais – não tenho certeza de como resolver isso.

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

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% 

Aqui está uma maneira de obter data e hora em uma única linha:

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

Nos EUA isso produzirá “aaaa-mm-dd hhmm”. Diferentes configurações regionais resultarão em diferentes saídas de% date%, mas você poderá modificar o pedido de token.

Se você quiser um formato diferente, modifique a instrução echo reorganizando os tokens ou usando separadores diferentes (ou não).

E aqui está um arquivo em lote similar para a parte do 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

Eu mudei a resposta com o arquivo de lote do vMax, então ele também funciona com o holandês.
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://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 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

Apenas use esta linha:

 PowerShell -Command "get-date" 

A solução one-liner de Matthew Johnson para obter a data e a hora do one-liner é eloquente e útil.

No entanto, é necessária uma modificação simples para trabalhar dentro de um arquivo em lotes:

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

Uma function baseada em 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 

De cabeça: região independente. Desvantagem: Somente os administradores do sistema podem executar o wmic.exe.

Uso:

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

Isso ecoa uma string como esta:

 2014-01-22 12:51:53 

Observe que os parâmetros de function são out-Parameters – ou seja, você deve fornecer nomes de variables ​​em vez de valores.

Todos os parâmetros são opcionais, portanto, call:Now YM é uma chamada válida se você deseja obter apenas ano e mês.

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 

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/

Eu tive um problema parecido. Eu tenho um download diário automático de um servidor FTP de um arquivo criptografado. Eu queria descriptografar o arquivo usando gpg, renomear o arquivo para a data atual (formato YYYYMMDD) e soltar o arquivo descriptografado em uma pasta para o departamento correto.

Eu passei por várias sugestões para renomear o arquivo de acordo com a data e não estava tendo sorte até me deparar com essa solução simples.

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

Funcionou perfeitamente (ou seja, o nome do arquivo sai como “2011-06-14.txt”).

(Fonte)

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

Look inside the ZIP file for something called “Date.exe” and rename it “DateFormat.exe” (to avoid conflicts).

Put it in your Windows system32 folder.

It has a lot of “date output” options.

For help, use DateFormat.exe --h

I’m not sure how you would put its output into an environment variable… using SET.

Regional independent solution generating the ISO date format:

 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: 

What could still be optimized: Other processes might get confused if using the date format in the short period while it is modified. So parsing the output according to the existing format string could be ‘safer’ – but will be more complicated

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

Given a known locality, for reference in functional form. The ECHOTIMESTAMP call shows how to get the timestamp into a variable ( DTS in this example.)

 @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 

And saved to file, timestamp.bat, here’s the output:

insira a descrição da imagem aqui

With Windows 7, this code works for 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% 

I know that there are numerous ways mentioned already. But here is my way to break it down to understand how it is done. Hopefully, it is helpful for someone who like step by step method.

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