Como obtenho a data / hora atual na linha de comando do Windows em um formato adequado para uso em um nome de arquivo / pasta?

540

Atualização: agora que é 2016, eu usaria o PowerShell para isso, a menos que haja um motivo realmente compatível com versões anteriores, principalmente por causa do problema de configurações regionais no uso date. Consulte https://stackoverflow.com/a/19799236/8479 do @ npocmaka


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

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

Eu realmente não me importo com o formato da data, idealmente seria aaaa-mm-dd, mas qualquer coisa simples está bem.

Até agora eu tenho isso, o 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 teria o formato mencionado anteriormente.

Estou usando o Windows Server 2003 e o Windows XP Professional. Não quero instalar utilitários adicionais para conseguir isso (embora eu saiba que existem alguns que farão uma boa formatação de data).

Rory
fonte
7
Criando um backup automatizado para o seu código? Bom para você! Devemos fazer isso também :)
Andrei Rînea
24
use pessoas do powershell ...[datetime]::now.tostring("yyyy-MM-dd")
Nacht - Reinstate Monica
É possível carregar arquivos com data de criação usando xp_cmdshell no SQL Server? Eu tenho uma pergunta sobre stackoverflow, consulte por favor a ligação @ stackoverflow.com/q/32293517/3327081
kolunar

Respostas:

667

Consulte Arquivo em lote do Windows (.bat) para obter a data atual no 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 você preferir o horário no formato militar de 24 horas, poderá substituir a segunda linha FOR por esta:

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

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

Se você deseja a data independentemente da ordem do dia / mês da região, pode usar "WMIC os GET LocalDateTime" como fonte, pois 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]

Jay
fonte
44
Para o pessoal do Reino Unido, você precisará For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)da segunda linha.
Rory
17
Esta solução é locale dependente, Rory deu o exemplo para o Reino Unido para outros locais onde a data vem como 22-02-2012 É necessário substituir delims = / com delims = -
Nuno Furtado
25
No meu sistema,% TIME% retorna valores como "0:01:15" e "3:15:12" e o código %% a %% b na resposta fornece um espaço inicial como "001" e "315". Para obter um hhmm de quatro dígitos, use o seguinte: For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))Isso retorna valores como "0001" e "0315", que eu prefiro nos meus nomes de arquivos.
Twamley 16/05
10
Boa versão do wmiccomando! Até agora eu só vi WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table. Da mesma forma, para entrar 20120623-1619no meu fuso horário local de Amsterdã, em uma linha: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
Para mim, diz%%a was unexpected at this time.
Scott zuz22 Blacklock
109

Análise de data e hora regionalmente independente

O formato de saída %DATE%e do dircomando é regionalmente dependente e, portanto, nem robusto nem inteligente. date.exe (parte do UnxUtils ) fornece qualquer informação de data e hora em qualquer formato possí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"
22-12-2009

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: 12/12/22-qualquer texto-18,55

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

As informações de data / hora de um arquivo de referência:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Utilizando-o em um script CMD para obter informações sobre ano, mês, dia e hora:

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

Utilizando-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 GNU gratuitas que não precisam de instalação.

NOTA: Copiar date.exepara qualquer diretório que esteja no caminho de pesquisa pode causar a falha de outros scripts que usam o datecomando interno do Windows .

Uri Liebeskind
fonte
4
Muito melhor do que a solução estranhamente mais populares acima, mas eu tive que adicionar / t para evitar o prompt no Windows 8.1
rainabba
6
O Windows 8.1 embutido date.exeparece depender da localidade. Ele retorna a data em dd / MM / aaaa no meu sistema, se fosse independente da localidade, esperaria MM / dd / aaaa ou aaaa-MM-dd. Eu não acho que esta resposta esteja falando sobre o date.exe embutido, mas sobre alguma versão de terceiros.
SSS
1
é independente do
código de
3
Observe que date.exe (parte do UnxUtils) não é o mesmo que o comando de data de criação. Portanto, se você precisar adicionar / t, o comando date do Windows será executado. Se algo como date.exe + "% Y-% m-% d" funcionar, você instalou o UnxUtils corretamente. :-)
just.do.it
É possível carregar arquivos com data de criação usando xp_cmdshell no SQL Server? Eu tentei o comando "forfiles", mas sem sucesso. Eu tenho uma pergunta sobre stackoverflow, consulte por favor a ligação @ stackoverflow.com/q/32293517/3327081
kolunar
104

Mais duas maneiras que não dependem das configurações de hora (ambas tiradas de : Como obter dados / hora 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 TODOS os sistemas 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 get-date .

  2. ROBOCOPIA - 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, desde o Windows Vista e superior:

    @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 oferecem mais flexibilidade, por exemplo, você pode obter a semana do ano, o tempo em milissegundos e assim por diante.

  3. JScript / lote híbrido (precisa ser salvo como .bat). O JScript está disponível em todos os sistemas NT e acima, como parte do Windows Script Host ( embora possa ser desativado pelo 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. Híbrido VSCRIPT / BATCH ( É possível incorporar e executar o VBScript em um arquivo em lotes sem usar um arquivo temporário? ) No mesmo caso do JScript, mas a hibridaçã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 com .NET - faça o download da Microsoft ( v1 , v2 , v3 (apenas para Windows 7 e superior)). Ele é instalado por padrão em tudo, desde o Windows 7 / Windows Server 2008 e superior:

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

    Para usá-lo em 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 é bastante 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 Não é possível obter o ano e o dia da semana. É relativamente lento e também cria um arquivo temporário e baseia-se nos carimbos de hora que o logman coloca em seus arquivos de log. Ele funcionará em tudo, desde o Windows XP e superior. Provavelmente nunca será usado por ninguém - inclusive eu -, mas é mais uma maneira ...

    @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 o WMIC, que também fornece a 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>
    
npocmaka
fonte
2
para o powershell C: \> para / f %% i in ('powershell get-date -format "{aaaamMMdd_HHmmss}"') definem datetime = %% i C: \> echo% datetime%
Samuel
1
makecab: isso funciona criando um arquivo chamado ~.rpte pesquisando um stringdentro dele, começando com makecab, que é uma linha parecida MakeCAB Report: Tue Sep 02 22:15:57 2014. para mim, esse comando não é localizado, é independente do local. Esse truque é confiar nisso. Vamos torcer para que nunca mais seja, ou então cuidado!
N611x007
10
Gosto do texto de abertura "Mais dois ..." seguido de 8 soluções.
Adam Smith
1
O que, não mshtahíbrido? :) Se importa se eu editar sua resposta e adicionar uma? Essa parece ser a melhor coleção de soluções esotéricas, e parece mshtapertencer aqui.
Rogerio
1
A solução aceita não funcionaria para mim, não importa o que eu tentasse. Várias dessas soluções funcionaram para mim. (Lote e PowerShell).
Brett Wait
44

Aqui está uma variante do alt.msdos.batch.nt que funciona localmente independentemente.

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 que o código funcione sem as mensagens de erro no stderr, tive que adicionar aspas simples e incluir as atribuições de variável para %% a, %% be %% c. Meu código de idioma (PT) estava causando erros em um estágio do loop / análise em que coisas como "set = 20" estavam sendo executadas. As aspas produzem um token (embora vazio) para o lado esquerdo da instrução de atribuição.

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

vMax
fonte
3
Isso é perfeito e é a abordagem mais simples e elegante que já vi até hoje.
Doug
2
Veja também melhorias de Jeroen , necessários como nem todas as localidades usar as cordas dd, mme yyna saída echo:^|date.
Arjan
não funciona em todos os locais. (Em alemão dateGeben Sie das neue Datum ein: (TT-MM-JJ), onde a JJquebra seu script (espera YY))
Stephan
35

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

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
azulado
fonte
Consulte Variáveis ​​de ambiente Cmd.exe com dois pontos e til nesta técnica pouco conhecida, mas muito eficiente. (Um ponteiro para uma referência de autoridade Microsoft seria apreciado.)
DavidRR
Aqui está a Referência de arquivos em lote da Microsoft para Windows XP . Essa referência inclui o uso de parâmetros em lote . Infelizmente, nenhuma discussão sobre a técnica de "fatiar".
DavidRR
Isso não funciona muito bem para mim. Talvez seja algo a ver com configurações regionais? Recebo uma saída de "/ 15 / - 1-We_1009" ao executá-lo na quarta-feira, 15 de outubro de 2014.
Joel B
26

As primeiras quatro linhas desse código fornecerão variáveis ​​confiáveis ​​e mínimas AAA 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
foxidrive
fonte
Perfeito, esta é a melhor solução para mim, pois ligar para o PS resultará na aparência do texto cmd para uma aparência engraçada.
Ste
25

Infelizmente, isso não é imune às configurações regionais, mas faz o que você deseja.

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 que você pode encontrar na Wikipedia .

Mark Ransom
fonte
1
Mark - Found Cmd.exe Variáveis ​​de ambiente com dois pontos e Tilde, que descreve a técnica de 'fatia' da variável exibida na sua resposta. Não encontrei mais essas informações no artigo da Wikipedia. Gostaria de encontrar uma referência autorizada da Microsoft.
DavidRR
1
Aqui está a Referência de arquivos em lote da Microsoft para Windows XP . Essa referência inclui o uso de parâmetros em lote . Infelizmente, nenhuma discussão sobre a técnica de "fatiar".
DavidRR
18

Use o seguinte script para obter o dia atual na linha de comando:

echo %Date:~0,3%day
sudipto roy
fonte
8
Jogou um pouco por aí com isso, é o mais curto que eu encontrei para conseguir Data e Hora: echo data%%% time%
loomi
15

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 ambas as minhas respostas aqui ainda dependem da ordem do dia e do mês, conforme determinado pelas configurações regionais - não tenho certeza de como contornar isso.

J c
fonte
14
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
DigiP
fonte
http://www.dotnetperls.com/7-zip-examplesalguns pontos positivos podem ser úteis para alguém no futuro.
Saravanan
13

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%
J c
fonte
10

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% date% saídas, mas você pode modificar a ordem do token.

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

Matthew Johnson
fonte
Existe uma maneira de obter a hora no formato de 12 horas e também exibir informações AM ou PM?
Sangli
9

Basta usar esta linha:

PowerShell -Command "get-date"
gdelfino
fonte
9

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
Yordan Georgiev
fonte
:: no cmd para / f% i in ('PowerShell-Command "get-date" -format "aaaamMMdd"') define yyyyMMdd =% i :: no script cmd para / f %% i in ('PowerShell-Command "get-date" -format "aaaamMMdd" ') define yyyyMMdd = %% i
Yordan Georgiev
8

A solução de uma linha de Matthew Johnson para obter a data e a hora de uma linha é eloquente e útil.

No entanto, ele precisa de uma modificação simples para trabalhar em 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
John Langstaff
fonte
1
Não funciona no CMD (%% um foi inesperado neste momento) ou no PowerShell (falta de abertura '(' depois de palavra-chave para) no Windows 8.1
rainabba
3
Rainabba, esse é exatamente o erro que você recebe quando esse comando é emitido a partir da linha CMD . No entanto, " de dentro de um arquivo em lotes ", o comando retorna "30-01-30 1324".
John Langstaff
1
ou muito mais simples seria sem o loopecho %date:/=-%%time::=-%
Gerhard Barnard
7

E aqui está um arquivo em lote semelhante 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

Jeroen Wiert Pluimers
fonte
Olá, consegui carregar arquivos de acordo com a data de modificação usando um comando abaixo, z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” mas quero saber como carregar arquivos de acordo com a data de criação. Qualquer ajuda será muito apreciada. Uma pergunta foi feita no stackoverflow, mas ainda não há resposta. Por favor, dê uma olhada no link para obter os detalhes stackoverflow.com/q/32293517/3327081
kolunar
1
Faça uma nova pergunta sobre isso. Eu nunca usei forfiles.
Jeroen Wiert Pluimers
7

Eu mudei a resposta com o arquivo de lote de VMAX para que ele funciona com a língua holandesa também.
Os holandeses - persistente como nós somos - tem algumas mudanças no %date%, date/te dateque quebra o lote-arquivo original.

Seria bom se algumas pessoas também pudessem verificar isso em outros locais do Windows e reportar os resultados.
Se o arquivo em lote falhar no seu local, 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 porquê:

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

Jeroen Wiert Pluimers
fonte
2
Alguns usam anos primeiro ou não possuem zeros à esquerda; consulte Formato de data da Wikipedia por país . Os franceses podem usar jj-mm-aaaapara jour, mois, annee? Italianos talvez gg/mm/aaaapara giorno, mese, anno? Alemães tt.mm.jjjjpara Tag, Monat, Jahr? Mas então: acho que na maioria dos países apenas algumas línguas são usadas. Como na Holanda, de fato, o Windows geralmente é inglês ou holandês, e não muito mais. Bom o suficiente para mim.
Arjan
2
Como um aparte: outra versão nos recursos ocultos dos arquivos em lotes do Windows é menos perfeita (precisa da correção para o holandês jje não impõe um ano de 4 dígitos), mas usa shiftpara descartar o dia como Monou ma. Apenas diferente.
Arjan
4
Ele quebra em um sistema alemão. O ano e o mês funcionam, mas o dia falha porque "day" começa com um "T" em alemão ("Tag"), não com um "d". A string de formato no prompt é (TT-MM-JJ), a date/tsaída é 23.06.2012. / cc @Arjan
balpha
2
Outro aspecto: também é possível obter o pedido no registro , usando reg query "HKCU\Control Panel\International" /vShortDate. Cuidado durante o teste: para um prompt de comando aberto, alterar essa configuração do Painel de Controle também altera o formato usado para exibir a data (para datee date /te echo %date%), mas no Windows 7 NÃO altera o formato para a nova data! Como mudar o meu formato de data abreviada em YY/MM/dd, fica me: The current date is: 12/06/23 Enter the new date: (mm-dd-yy). A abertura de um novo prompt de comando corrige isso.
Arjan
2
@ Arjan deve ser reg query "HKCU\Control Panel\International" /v sShortDate.
tricasse
6

Isto é 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 aberto / gratuito que você pode usar ou revisar para obter idéias: http://wittman.org/ziparcy/

micahwittman
fonte
No meu sistema,% date% contém "ter 14/10/2008". Então, você ainda precisará cortar (ou lidar com) o "ter" e o caractere de espaço.
BoltBait 14/10/08
Oi @micahwittman. É possível carregar arquivos com data de criação usando xp_cmdshell no SQL Server? Eu tentei o comando "forfiles", mas sem sucesso. Eu tenho uma pergunta sobre stackoverflow, consulte por favor a ligação @ stackoverflow.com/q/32293517/3327081
kolunar
5

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

Passei por várias sugestões para renomear o arquivo de acordo com a data e não tive sorte até encontrar 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)

KChiki
fonte
5

Uma função 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

Cabeça: Independente da região. Desvantagem: Apenas administradores de sistema podem executar o wmic.exe.

Uso:

call:Now Y M D H N S
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 função são out-Parameters - ou seja, você deve fornecer nomes de variáveis ​​em vez de valores.

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

Tomalak
fonte
4

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

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

Coloque-o na pasta system32 do Windows.

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

Para obter ajuda, use DateFormat.exe --h

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

Sally
fonte
1
Obrigado, embora esta pergunta seja especificamente para fazer isso sem o download de ferramentas adicionais.
Rory
3

Solução independente regional que gera o formato de 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:

O que ainda pode ser otimizado: Outros processos podem ficar confusos se você usar o formato da data no curto período de tempo enquanto ele é modificado. Portanto, analisar a saída de acordo com a string de formato existente pode ser 'mais seguro' - mas será mais complicado

V15I0N
fonte
você pode registrar a consulta iDate ( technet.microsoft.com/en-us/library/cc978637.aspx ) e prosseguir condicionalmente (três valores possíveis de acordo com a technet) - embora eu ainda não tenha tentado isso.
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 [email protected]
:: - http://stackoverflow.com/questions/203090
@echo off

set _isotime=
set _now=

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

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

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

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

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

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

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

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

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

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

:_out
:: EOF: GetDate.cmd
Adolfo
fonte
0

Dada uma localidade conhecida, para 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 em arquivo, timestamp.bat, aqui está a saída:

insira a descrição da imagem aqui

bvj
fonte
Parece que isso vem com a questão regional - isso não funciona em todas as máquinas inglesas.
Não surpreende, @SteveFest. Se fosse possível definir temporariamente o código de idioma, isso poderia ajudar a fornecer uma solução global, mas parece que é necessário conhecer a região com antecedência. Seu local é en-US ou en-SomewhereElse?
BVJ
@SteveFest Suponho que seria possível criar uma lista de locais onde cada um inclui expressões de data / hora com uma amostra para validar. Estou super ocupado, mas vou tentar atualizar minha resposta para ilustrar. Você poderia me mostrar amostras das saídas HK de data / hora? Eu posso estar assumindo tolamente que zh-HK imprime dígitos com deslocamentos fixos.
BVJ
zh-HK: (yy)yy年m月d日 hh:mm- sem zeros à esquerda. (aa) pode ser ignorado, pois temos um ano com 2 ou 4 dígitos. Mas observe uma coisa: o formato da data e hora pode ser alterado por máquina.
Obrigado @SteveFest, vou acompanhar dentro de algumas semanas. Execute systeminfona CLI e deixe-me saber o que você vê System Locale. O programa leva tempo para ser executado, mas talvez o resultado da localidade possa ser armazenado em cache e subsequentemente usado para indexar um formato de carimbo de data / hora.
BVJ
0

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%
Frizz1977
fonte
E de novo. É bom que ele funciona em sua máquina, mas você perdeu o pontoindependent of the regional settings of the machine
jeb
-1

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

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

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%
Ed999
fonte
2
Ele mencionou uma solução independente da região ...particularly because of the regional settings issue with using date. Btw. Sua solução é igual às vinte outras respostas.
jeb
Sim, mas o meu realmente pode (opcionalmente) ser usado na linha de comando. Qual é o mérito em publicar 35 linhas de código, se uma linha fornecer a mesma solução?
Ed999
Eu não consigo ver qualquer diferença relevante para as antigas respostas de @Matthew Johnson de 2010 ou @KChiki de 2011
jeb
mesmo que esta resposta está incorreta, a comentar o answr real, um loop não é necessário aqui quando você poderia simplesmente ter feitoecho %date:/=-%
Gerhard Barnard
Não. Se você omitir o loop FOR, nenhuma variável poderá ser criada e a data que você teve o problema de extrair ainda será inútil. Com o loop FOR, as variáveis ​​criadas pelo loop estão disponíveis para uso em outras partes do script. Eu reprovo fortemente o uso de dezenas de linhas de código para criar o loop FOR, quando apenas uma linha é necessária. E eu reprovo fortemente a publicação de soluções que não são de linha de comando, nas quais o fornecedor solicitou especificamente uma solução de linha única para uso na linha de comando.
Ed999
-3

Eu sei que existem inúmeras maneiras já mencionadas. Mas aqui está a minha maneira de decompô-lo para entender como isso é feito. Felizmente, é útil para quem gosta de 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
Gifcrazy
fonte
3
Você perdeu o pontoindependent of the regional settings of the machine
jeb