Как получить текущую дату и время в командной строке Windows в подходящем формате для использования в имени файла? - PullRequest
500 голосов
/ 15 октября 2008

Обновление: теперь, когда наступил 2016 год, я бы использовал PowerShell для этого, если только для этого нет действительно убедительной обратной совместимости, особенно из-за проблемы региональных настроек при использовании date. Смотрите @ npocmaka's https://stackoverflow.com/a/19799236/8479


Какие операторы командной строки Windows я могу использовать для получения текущей даты и времени в формате, который я могу поместить в имя файла?

Я хочу получить файл .bat, который заархивирует каталог в архив с текущей датой и временем в качестве части имени, например, Code_2008-10-14_2257.zip. Есть ли простой способ сделать это независимо от региональных настроек машины?

Я действительно не против формата даты, в идеале это будет гггг-мм-дд, но все, что угодно, просто отлично.

Пока у меня есть это, которое на моей машине дает мне 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

Я могу жить с этим, но это кажется немного неуклюжим. В идеале это было бы более коротким и имело формат, упомянутый ранее.

Я использую Windows Server 2003 и Windows XP Professional. Я не хочу устанавливать дополнительные утилиты для этого (хотя я понимаю, что есть некоторые, которые будут делать хорошее форматирование даты).

Ответы [ 28 ]

640 голосов
/ 15 октября 2008

См. Пакетный файл Windows (.bat) для получения текущей даты в формате 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%

Если вы предпочитаете время в 24-часовом / военном формате, вы можете заменить вторую строку FOR следующим:

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

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

Если вы хотите указывать дату независимо от порядка дня / месяца в регионе, вы можете использовать «WMIC os GET LocalDateTime» в качестве источника, поскольку она находится в порядке 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
Местная дата: [2012-06-19 10: 23: 47.048]

100 голосов
/ 23 декабря 2009

Регионально независимый разбор даты и времени

Выходной формат %DATE% и команды dir зависит от региона и, следовательно, не является надежным и интеллектуальным. date.exe (часть UnxUtils ) предоставляет любую информацию о дате и времени в любом мыслимом формате. Вы также можете извлечь информацию о дате / времени из любого файла с помощью date.exe.

Примеры: (в cmd-скрипте используйте %% вместо%)

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: любой текст

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Текст: 09/12/22 - любой текст - 18,55

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

Информация о дате / времени из справочного файла:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Использование его в сценарии CMD для получения информации о годе, месяце, дне и времени:

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

Использование его в сценарии CMD для получения метки времени в любом необходимом формате:

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

Извлечение информации о дате / времени из любого ссылочного файла.

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

Добавление в файл информации о дате / времени:

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 является частью бесплатных инструментов GNU , которые не требуют установки.

ПРИМЕЧАНИЕ. Копирование date.exe в любой каталог, находящийся в пути поиска, может вызвать сбой других сценариев, использующих встроенную в Windows команду date.

86 голосов
/ 06 ноября 2013

Еще два способа, которые не зависят от настроек времени (оба взяты из : Как получить данные / время независимо от локализации: ). И оба также получают день недели, и ни один из них не требует прав администратора!:

  1. MAKECAB - будет работать в КАЖДОЙ системе Windows (быстро, но создает небольшой временный файл) (скрипт 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
    

    Дополнительная информация о функции получения даты .

  2. ROBOCOPY - это не встроенная команда для Windows XP и Windows Server 2003, но ее можно загрузить с сайта Microsoft . Но встроен во все, от Windows Vista и выше:

    @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
    

    И еще три способа использования других языков сценариев Windows. Они дадут вам больше гибкости, например Вы можете получить неделю года, время в миллисекундах и т. д.

  3. JScript / пакет гибридный (необходимо сохранить как .bat). JScript доступен в любой системе от NT и выше как часть Windows Script Host (, хотя его можно отключить через реестр, это редкий случай ):

    @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 hybrid ( Возможно ли встроить и выполнить VBScript в пакетном файле без использования временного файла? ) тот же случай как JScript, но гибридизация не так совершенна:

    :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 - может быть установлен на любой машине с .NET - скачать с Microsoft ( v1 , v2 , v3 (только для Windows 7 и выше)). Он установлен по умолчанию на все, начиная от Windows 7 / Windows Server 2008 и выше:

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

    Чтобы использовать его из командного файла:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Самоскомпилированный jscript.net/batch (никогда не видел машину с Windows без .NET, поэтому я думаю, что это довольно переносимо):

    @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 Невозможно определить год и день недели. Это сравнительно медленно, а также создает временный файл и основывается на отметках времени, которые logman помещает в свои файлы журнала. Это будет работать на всем от Windows XP и выше. Это, вероятно, никогда не будет использоваться никем - включая меня - но это еще один способ ...

    @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. Еще один способ с WMIC , который также дает неделю года и день недели, но не миллисекунды (для миллисекунд проверьте ответ 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. Использование TYPEPERF с некоторыми усилиями, чтобы быть быстрым и совместимым с различными настройками языка и как можно быстрее:

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=")
    set "mon="
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. MSHTA позволяет вызывать методы JavaScript, аналогичные методу JScript, продемонстрированному в # 3 выше. Имейте в виду, что свойства объекта JavaScript в JavaScript, включающие значения месяцев, пронумерованы от 0 до 11, а не от 1 до 12. Поэтому значение 9 означает октябрь.

    <!-- : 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>
    
42 голосов
/ 08 июля 2010

Вот вариант из alt.msdos.batch.nt, который работает локально независимо.

Поместите это в текстовый файл, например, 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<-------------

Чтобы заставить код работать без сообщений об ошибках в stderr, я должен был добавить одинарные кавычки вокруг назначения переменных для %% a, %% b и %% c. Моя локаль (PT) вызывала ошибки на одном этапе зацикливания / разбора, когда выполнялись такие вещи, как «set = 20». Кавычки дают токен (хотя и пустой) для левой части оператора присваивания.

Недостатком являются грязные имена переменных локали: 'yy', 'mm' и 'dd'. Но эй, кого это волнует!

33 голосов
/ 12 апреля 2009

Я использую это (опять же не зависит от региона (Великобритания))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
24 голосов
/ 15 октября 2008

К сожалению, это не защищает от региональных настроек, но делает то, что вы хотите.

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%

Удивительные вещи, которые вы можете найти в Википедии .

17 голосов
/ 07 сентября 2014

Первые четыре строки этого кода предоставят вам надежные переменные YY DD MM YYYY HH Min Sec в Windows XP Professional и более поздних версиях.

@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
16 голосов
/ 15 июля 2011

Пожалуйста, используйте следующий скрипт, чтобы получить текущий день в командной строке:

echo %Date:~0,3%day
15 голосов
/ 15 октября 2008

Другой способ ( кредит ):

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

Обратите внимание, что оба моих ответа здесь все еще зависят от порядка дня и месяца, определенных региональными настройками - не знаю, как обойти это.

14 голосов
/ 04 декабря 2009
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
...