Formatar data e hora em um script em lotes do Windows

Em um script em lote do Windows (Windows XP), preciso formatar a data e a hora atuais para uso posterior em nomes de arquivos, etc.

É semelhante à pergunta do Stack Overflow. Como append uma data em arquivos em lote , mas também com a hora.

Eu tenho isso até agora:

echo %DATE% echo %TIME% set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2% echo %datetimef% 

que dá:

 28/07/2009 8:35:31.01 2009_07_28__ 8_36_01 

Existe uma maneira que eu possa permitir uma hora de dígito único em% TIME%, para que eu possa obter o seguinte?

 2009_07_28__08_36_01 

Eu terminei com este script:

 set hour=%time:~0,2% if "%hour:~0,1%" == " " set hour=0%hour:~1,1% echo hour=%hour% set min=%time:~3,2% if "%min:~0,1%" == " " set min=0%min:~1,1% echo min=%min% set secs=%time:~6,2% if "%secs:~0,1%" == " " set secs=0%secs:~1,1% echo secs=%secs% set year=%date:~-4% echo year=%year% 

:: No WIN2008R2, por exemplo, eu precisava fazer seu ‘set month =% date: ~ 3,2%’ como abaixo: caso contrário, 00 aparecerá para MONTH

 set month=%date:~4,2% if "%month:~0,1%" == " " set month=0%month:~1,1% echo month=%month% set day=%date:~0,2% if "%day:~0,1%" == " " set day=0%day:~1,1% echo day=%day% set datetimef=%year%%month%%day%_%hour%%min%%secs% echo datetimef=%datetimef% 
 @ECHO OFF : Sets the proper date and time stamp with 24Hr Time for log file naming : convention SET HOUR=%time:~0,2% SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2% if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%) ECHO %dtStamp% PAUSE 

Aqui está como eu gero um nome de arquivo de log (com base em http://ss64.com/nt/syntax-getdate.html ):

 @ECHO OFF :: Check WMIC is available WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error :: Use WMIC to retrieve date and time FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO ( IF "%%~L"=="" goto s_done Set _yyyy=%%L Set _mm=00%%J Set _dd=00%%G Set _hour=00%%H SET _minute=00%%I SET _second=00%%K ) :s_done :: Pad digits with leading zeros Set _mm=%_mm:~-2% Set _dd=%_dd:~-2% Set _hour=%_hour:~-2% Set _minute=%_minute:~-2% Set _second=%_second:~-2% Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second% goto make_dump :s_error echo WMIC is not available, using default log filename Set logtimestamp=_ :make_dump set FILENAME=database_dump_%logtimestamp%.sql ... 

Se o PowerShell estiver instalado, você poderá obter a Data / Hora de maneira fácil e confiável em qualquer formato que desejar, por exemplo:

 for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a move "%oldfile%" "backup-%datetime%" 

É claro que hoje em dia o PowerShell está sempre instalado, mas no Windows XP você provavelmente só desejará usar essa técnica se seu script em lote estiver sendo usado em um ambiente conhecido onde você sabe que o PS está disponível (ou verifique seu arquivo em lotes se o PowerShell estiver disponível …)

Você pode razoavelmente perguntar: por que usar um arquivo de lote se você pode usar o PowerShell para obter a data / hora, mas acho que algumas razões óbvias são: (a) você não é tão familiarizado com o PowerShell e ainda prefere fazer mais coisas da maneira antiga com arquivos em lote ou (b) você está atualizando um script antigo e não quer portar tudo para o PS.

Eu me deparei com esse problema hoje e resolvi com:

 SET LOGTIME=%TIME: =0% 

Substitui espaços com 0s e basicamente zero-pads a hora.

Após algumas pesquisas rápidas, não descobri se eram necessárias extensões de comando (ainda trabalhei com o SETLOCAL DISABLEEXTENSIONS).

Eu costumo fazer isso sempre que preciso de uma string de data / hora:

 set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2% set dt=%dt: =0% 

Isto é para o formato de data / hora em alemão (dd.mm.aaaa hh: mm: ss). Basicamente eu concateno os substrings e finalmente substituo todos os espaços por zeros.

Breve explicação de como substrings funcionam:

 %VARIABLE:~num_chars_to_skip,num_chars_to_keep% 

Então, para obter apenas o ano de uma data como “29.03.2018” use:

 %DATE:~6,4% ^-----skip 6 characters ^---keep 4 characters 

Como foi observado, analisar a data e a hora é útil apenas se você souber o formato usado pelo usuário atual (por exemplo, MM / dd / aa ou dd-MM-aaaa apenas para nomear dois). Isso pode ser determinado, mas no momento em que você faz todo o esforço e análise, você ainda terá uma situação em que há um formato inesperado usado, e mais ajustes serão necessários.

Você também pode usar algum programa externo que retornará um slug de data em seu formato preferido, mas isso tem desvantagens de precisar distribuir o programa utilitário com seu script / lote.

Há também truques de lote usando o relógio CMOS de uma maneira bem crua, mas isso é muito próximo dos fios desencapados para a maioria das pessoas, e também nem sempre é o local preferido para recuperar a data / hora.

Abaixo está uma solução que evita os problemas acima. Sim, ele apresenta alguns outros problemas, mas, para os meus propósitos, descobri que essa é a solução mais fácil, mais clara e mais portátil para criar um registro de data e hora em arquivos .bat para sistemas Windows modernos. Este é apenas um exemplo, mas acho que você vai ver como modificar para outros formatos de data e / ou hora, etc.

 reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f @REM reg query "HKCU\Control Panel\International" /v sShortDate set LogDate=%date% reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 

O seguinte pode não ser uma resposta direta, mas próxima?

 set hour=%time:~0,2% if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2% else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2% 

Pelo menos pode ser inspirador.

Se você não precisa exatamente deste formato:

 2009_07_28__08_36_01 

Então você pode usar as seguintes 3 linhas de código que usa% date% e% time%:

 set mydate=%date:/=% set mytime=%time::=% set mytimestamp=%mydate: =_%_%mytime:.=_% 

Nota: Os caracteres / e : são removidos e o caractere . e o espaço é substituído por um sublinhado.

Exemplo de saída (tirada quarta-feira, 8/5/15 às 12:49, com 50 segundos e 93 milissegundos):

 echo %mytimestamp% Wed_08052015_124950_93 
 REM Assumes UK style date format for date environment variable (DD/MM/YYYY). REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero. REM If first character of time is a space (less than 1) then set DATETIME to: REM YYYY-MM-DD-0h-mm-ss REM Otherwise, set DATETIME to: REM YYYY-MM-DD-HH-mm-ss REM Year, month, day format provides better filename sorting (otherwise, days grouped REM together when sorted alphabetically). IF "%time:~0,1%" LSS "1" ( SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2% ) ELSE ( SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2% ) ECHO %DATETIME% 

A formatação offset:length suportada com o comando SET no Windows não permitirá que você preencha 0 como parece estar interessado.

No entanto, você pode codificar um script BATCH para verificar se a hora é menor que 10 e
pad de acordo com uma seqüência de echo diferente.

Você encontrará algumas informações sobre o comando SET neste link .


Você também pode mudar para outros methods de programação para chegar até aqui.

É bastante simples no unix bash (disponível com o Cygwin no Windows) apenas para dizer,

 date +%Y_%m_%d__%H_%M_%S 

E isso sempre funciona corretamente.

Eu fiz assim:

 REM Generate FileName from date and time in format YYYYMMTTHHMM Time /T > Time.dat set /P ftime= < Time.dat set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log echo %FileName% 

LogFile201310170928.log

Para gerar um timestamp YYYY-MM-DD hh:mm:ss (24 horas), uso:

 SET CURRENTTIME=%TIME% IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%) FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%) 
 ::======================================================================== ::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS ::======= ================================================================ FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a SET DATETIME=%DTS:~0,8%-%DTS:~8,6% 

A primeira linha sempre gera neste formato o fuso horário:
20150515150941.077000 + 120
Isso deixa você com apenas a formatação da saída para atender aos seus desejos.

 set hourstr = %time:~0,2% if "%time:~0,1%"==" " (set hourstr=0%time:~1,1%) set datetimestr=%date:~0,4%%date:~5,2%%date:~8,2%-%hourstr%%time:~3,2%%time:~6,2% 

Crie um arquivo chamado “search_files.bat” e coloque o conteúdo abaixo no arquivo. Em seguida, clique duas vezes nele. A variável% THH% temporária foi colocada em funcionamento para lidar adequadamente com o AM. Se houver um 0 nos primeiros 2 dígitos do tempo, o Windows ignora o resto do nome do arquivo LOG.

 CD . SET THH=%time:~0,2% SET THH=%THH: =0% dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG 

Esse script em lote fará exatamente o que o OP deseja (testado no Windows XP SP3).

Eu também usei esse truque de registro inteligente descrito por “jph” anteriormente, que IMHO é a maneira mais simples de obter formatação 100% consistente da data para "yyyy_MM_dd" em qualquer sistema Windows novo ou antigo. A alteração em um valor do Registro para fazer isso é temporária e trivial instantânea; dura apenas alguns milissegundos antes de ser imediatamente revertido.

Clique duas vezes nesse arquivo em lotes para uma demonstração instantânea, a janela do prompt de comando aparecerá e exibirá seu timestamp. . . . .

 @ECHO OFF SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A TITLE GENERATE A CUSTOM FORMATTED TIMESTAMP USING %%DATE%% AND %%TIME%% COMMANDS :: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd", REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul SET MYDATE=%date% :: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul :: --- SPLIT THE TIME DIGITS TO THREE BLOCKS [H] [MM] [SS.SS] FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO SET HOUR=%%A& SET MINUTES=%%B& SET SECONDS=%%C :: --- YOUR CHOICE - FOR 4 DIGIT SECONDS - REMOVES THE DOT FROM THE SECONDS BLOCK [SS.SS] :: SET SECONDS=%SECONDS:.=% :: --- YOUR CHOICE - FOR 2 DIGIT SECONDS - GETS THE FIRST TWO DIGITS FROM THE SECONDS BLOCK [SS.SS] SET SECONDS=%SECONDS:~0,2% :: --- GET THE "AM PM" STRING TO CHECK THE HOUR BLOCK FOR /F "tokens=1,2 delims= " %%A IN ('time /t') DO SET AM_PM=%%B :: --- CONVERT THE HOUR BLOCK [H] TO "24 HOUR" FORMAT [HH] IF %AM_PM%==PM ( IF %HOUR%==01 (SET HOUR=13) IF %HOUR%==02 (SET HOUR=14) IF %HOUR%==03 (SET HOUR=15) IF %HOUR%==04 (SET HOUR=16) IF %HOUR%==05 (SET HOUR=17) IF %HOUR%==06 (SET HOUR=18) IF %HOUR%==07 (SET HOUR=19) IF %HOUR%==08 (SET HOUR=20) IF %HOUR%==09 (SET HOUR=21) IF %HOUR%==10 (SET HOUR=22) IF %HOUR%==11 (SET HOUR=23) ) ELSE ( IF %HOUR%==12 (SET HOUR=00) IF %HOUR%==1 (SET HOUR=01) IF %HOUR%==2 (SET HOUR=02) IF %HOUR%==3 (SET HOUR=03) IF %HOUR%==4 (SET HOUR=04) IF %HOUR%==5 (SET HOUR=05) IF %HOUR%==6 (SET HOUR=06) IF %HOUR%==7 (SET HOUR=07) IF %HOUR%==8 (SET HOUR=08) IF %HOUR%==9 (SET HOUR=09) ) :: --- GENERATE OUR WANTED TIMESTAMP ECHO. & ECHO. SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS% ECHO Your timestamp is: %TIMESTAMP% :: --- WAIT - VIEW THE RESULT IN THE CONSOLE SCREEN ECHO. & ECHO. ECHO Job is done. Press any key to exit . . . PAUSE > NUL EXIT 

Esse arquivo bat (salvar como datetimestr.bat) produz a string datetime 3 vezes: (1) string de data e hora longa com dia da semana e segundos, (2) string de data e hora curta sem eles e (3) versão curta do código.

 @echo off REM "%date: =0%" replaces spaces with zeros set d=%date: =0% REM "set yyyy=%d:~-4%" pulls the last 4 characters set yyyy=%d:~-4% set mm=%d:~4,2% set dd=%d:~7,2% set dow=%d:~0,3% set d=%yyyy%-%mm%-%dd%_%dow% set t=%TIME: =0% REM "%t::=%" removes semi-colons REM Instead of above, you could use "%t::=-%" to REM replace semi-colons with hyphens (or any REM non-special character) set t=%t::=% set t=%t:.=% set datetimestr=%d%_%t% @echo Long date time str = %datetimestr% set d=%d:~0,10% set t=%t:~0,4% set datetimestr=%d%_%t% @echo Short date time str = %datetimestr% @REM Short version of the code above set d=%date: =0% set t=%TIME: =0% set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2% @echo Datetimestr = %datetimestr% pause 

Para dar o devido crédito, juntei os conceitos de Peter Mortensen (18 de junho de 2014 às 21:02) e opello (25 de agosto de 2011 às 14:27).

Você pode escrever isso muito mais curto, mas essa versão longa facilita a leitura e a compreensão do código.

Eu gosto da versão curta em cima de @The lorax, mas para outras configurações de idioma pode ser um pouco diferente.

Por exemplo, nas configurações de idioma alemão (com formato de data natural: dd.mm.aaaa), a consulta do mês precisa ser alterada de 4,2 para 3,2:

 @ECHO OFF : Sets the proper date and time stamp with 24h time for log file naming convention ie SET HOUR=%time:~0,2% SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2% if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%) ECHO %dtStamp% : Outputs= 20160727_081040 : (format: YYYYMMDD_HHmmss; eg: the date-output of this post timestamp) PAUSE 

Eu sou realmente novo em arquivos em lote e este é o meu código !! (Não sei porquê, mas não consegui combinar data / te hora / t e não consegui utilizar % date% e % time% directamente sem uma variável …)

 @ECHO OFF set ldt=%date% %time% echo %ldt%>> logs.txt EXIT 

É um tipo de reutilização de outros (a questão era obter um timedato formatado para usar como nome de arquivo).

Este é o meu 2 centavos para uma datetime string . Nos sistemas MM DD YYYY , alterne a primeira e a segunda %DATE:~ inputs.

  REM ==================================================================================== REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME REM ==================================================================================== REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character) REM ==================================================================================== REM CHECK for SHORTDATE dd DDxMMxYYYY IF "%DATE:~0,1%" GTR "3" ( SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2% ) ELSE ( REM ASSUMES SHORTDATE DDxMMxYYYY SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2% ) REM CORRECT FOR HOURS BELOW 10 IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5% ECHO %DATETIME% 

Eu tentei a resposta aceita e funciona muito bem. Infelizmente, o formato de hora dos EUA parece ser H: MM: SS.CS, e o 0 ausente na frente estava causando problemas de análise antes das 10 da manhã. Para superar esse obstáculo e também permitir a análise da maioria dos formatos de horário mundial, criei essa rotina simples que parece funcionar muito bem.

 :ParseTime rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99 FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d" GOTO :EOF 

O legal dessa rotina é que você passa a string de tempo como o primeiro parâmetro e o nome da variável de ambiente que você quer que contenha o tempo (em centésimos de segundo) como o segundo parâmetro. Por exemplo:

 CALL :ParseTime %START_TIME% START_CS CALL :ParseTime %TIME% END_CS SET /A DURATION=%END_CS% - %START_CS% 

(* Chris *)

Talvez algo assim:

 @call:DateTime @for %%? in ( "Year :Y" "Month :M" "Day :D" "Hour :H" "Minutes:I" "Seconds:S" ) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_ :: OUTPUT :: Year : _DT_Y_ : 2014 :: Month : _DT_M_ : 12 :: Day : _DT_D_ : 17 :: Hour : _DT_H_ : 09 :: Minutes : _DT_I_ : 04 :: Seconds : _DT_S_ : 35 @pause>nul @goto:eof :DateTime @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1 @if not errorlevel 1 ( @for /f "skip=1 tokens=1-6" %%a in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" ) ) else ( @set "_DT_T_=1234567890 " ) @if errorlevel 1 ( @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?" @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b" @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c" ) @if errorlevel 1 ( @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_") @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c" @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c" @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_=" ) @for %%i in ("Y" ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+= 0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k" @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k" @exit/b 
 :: ============================================================= :: Batch file to display Date and Time seprated by undescore. :: ============================================================= :: Read the system date. :: ============================================================= @SET MyDate=%DATE% @SET MyDate=%MyDate:/=:% @SET MyDate=%MyDate:-=:% @SET MyDate=%MyDate: =:% @SET MyDate=%MyDate:\=:% @SET MyDate=%MyDate::=_% :: ============================================================= :: Read the system time. :: ============================================================= @SET MyTime=%TIME% @SET MyTime=%MyTime: =0% @SET MyTime=%MyTime:.=:% @SET MyTime=%MyTime::=_% :: ============================================================= :: Build the DateTime string. :: ============================================================= @SET DateTime=%MyDate%_%MyTime% :: ============================================================= :: Display the Date and Time as it is now. :: ============================================================= @ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%" :: ============================================================= :: Wait before close. :: ============================================================= @PAUSE :: ============================================================= 

Para uma solução muito simples para data numérica para uso em nomes de arquivos, use o seguinte código:

 set month=%date:~4,2% set day=%date:~7,2% set curTimestamp=%month%%day%%year% rem then the you can add a prefix and a file extension easily like this echo updates%curTimestamp%.txt 

Dividir os resultados do comando de data por barra, então você pode mover cada um dos tokens para as variables ​​apropriadas.

 FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO ( SET _Month=%%a SET _Day=%%b SET _Year=%%c ) ECHO Month %_Month% ECHO Day %_Day% ECHO Year %_Year% 

Use o REG para salvar / modificar / restaurar os valores que forem mais úteis para o seu arquivo bat. Este é o windows 7, para outras versões você pode precisar de um nome de chave diferente.

 reg save "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg /y reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f set file=%DATE%-%TIME: =0% reg restore "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg set file=%file::=-% set file=%file:.=-% set file 

Em situações como essa, use uma abordagem de programação simples e padrão: em vez de gastar um grande esforço analisando uma entidade desconhecida, salve a configuração atual, redefina-a em um estado conhecido, extraia as informações e restaure o estado original. Use apenas resources padrão do Windows.

Especificamente, os formatos de data e hora são armazenados sob a chave do Registro HKCU \ Control Panel \ International \ em [MS definition] “values”: “sTimeFormat” e “sShortDate”. Reg é o editor de registro do console incluído em todas as versões do Windows. Privilégios elevados não são necessários para modificar a chave HKCU

 Prompt $N:$D $T$G ::Save current config to a temporary (unique name) subkey, Exit if copy fails Set DateTime= Set ran=%Random% Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f If ErrorLevel 1 GoTO :EOF ::Reset the date format to your desired output format (take effect immediately) ::Resetting the time format is useless as it only affect subsequent console windows ::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss" /f Reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f ::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2% Set DateTime=%DateTime: =0% ::Restore the original config and delete the temp subkey, Exit if restore fails Reg copy "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f If ErrorLevel 1 GoTO :EOF Reg delete "HKCU\Control Panel\International-Temp%ran%" /f 

Simples, direto e deve funcionar para todas as regiões.

Por razões que eu não entendo, a redefinição do valor “sShortDate” entra em vigor imediatamente em uma janela do console, mas a reconfiguração do valor “sTimeFormat” muito semelhante NÃO entra em vigor até que uma nova janela do console seja aberta. No entanto, a única coisa que pode ser alterada é o delimitador – as posições dos dígitos são fixas. Da mesma forma, o token de hora “HH” deve preceder os zeros iniciais, mas não o faz. Felizmente, as soluções alternativas são fáceis.

Usando%, você terá um erro de operação hexadecimal quando o valor de tempo for 7-9. Para evitar isso, use os valores de DelayedExpansion e grab time com! Min: ~ 1!

Um método alternativo, se você tiver o PowerShell, deverá chamar isso:

 for /F "usebackq delims=Z" %%i IN (`powershell Get-Date -format u`) do (set server-time=%%i) 

Esse script usa uma interface WMI acessada primária por meio da ferramenta WMIC, que é parte integrante do Windows desde o Windows XP Professional (a Home edition também é suportada, mas a ferramenta não é instalada por padrão). O script também implementa uma solução alternativa para a ferramenta WMIC ausente, criando e chamando um vbscript do WSH para acessar uma interface WMI e gravar na saída do console a hora com o mesmo formato fornecido pela ferramenta WMIC.

 @ECHO OFF REM Returns: RETURN REM Modify: RETURN, StdOut REM Required - mandatory: none REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter REM YYYY = 4-digit year REM MM = 2-digit month REM DD = 2-digit day REM hh = 2-digit hour REM mm = 2-digit minute REM ss = 2-digit second REM ms = 3-digit millisecond CALL :getTime %* ECHO %RETURN% GOTO :EOF REM SUBROUTINE REM Returns: RETURN REM Modify: RETURN REM Required - mandatory: none REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter REM YYYY = 4-digit year REM MM = 2-digit month REM DD = 2-digit day REM hh = 2-digit hour REM mm = 2-digit minute REM ss = 2-digit second REM ms = 3-digit millisecond :getTime SETLOCAL EnableDelayedExpansion SET DELIM=- WHERE /Q wmic.exe IF NOT ERRORLEVEL 1 FOR /F "usebackq skip=1 tokens=*" %%x IN (`wmic.exe os get LocalDateTime`) DO (SET DT=%%x & GOTO getTime_Parse) SET _TMP=%TEMP:"=% ECHO Wscript.StdOut.WriteLine (GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").LocalDateTime)>"%_TMP%\get_time_local-helper.vbs" FOR /F "usebackq tokens=*" %%x IN (`cscript //B //NoLogo "%_TMP%\get_time_local-helper.vbs"`) DO (SET DT=%%x & GOTO getTime_Parse) :getTime_Parse SET _RET= IF "%1" EQU "" ( SET _RET=%DT:~0,4%%DELIM%%DT:~4,2%%DELIM%%DT:~6,2%%DELIM%%DT:~8,2%%DELIM%%DT:~10,2%%DELIM%%DT:~12,2%%DELIM%%DT:~15,3% ) ELSE ( REM Not recognized format strings are ignored during parsing - no error is reported. :getTime_ParseLoop SET _VAL= IF "%1" EQU "YYYY" SET _VAL=%DT:~0,4% IF "%1" EQU "MM" SET _VAL=%DT:~4,2% IF "%1" EQU "DD" SET _VAL=%DT:~6,2% IF "%1" EQU "hh" SET _VAL=%DT:~8,2% IF "%1" EQU "mm" SET _VAL=%DT:~10,2% IF "%1" EQU "ss" SET _VAL=%DT:~12,2% IF "%1" EQU "ms" SET _VAL=%DT:~15,3% IF DEFINED _VAL ( IF DEFINED _RET ( SET _RET=!_RET!%DELIM%!_VAL! ) ELSE ( SET _RET=!_VAL! ) ) SHIFT IF "%1" NEQ "" GOTO getTime_ParseLoop ) ENDLOCAL & SET RETURN=%_RET% GOTO :EOF