Как получить день месяца и год из сценария Windows cmd.exe?

Как получить текущий день месяца и года из сценария Windows cmd? Мне нужно получить каждое значение в отдельной переменной.

15 ответов

Решение

Вариант сценария, который работает независимо от локали. Поместите его в текстовый файл с расширением.cmd и запустите.

::: Begin set date

for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date

:set_date
if "%1:~0,1%" gtr "9" shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof

:end_set_date
::: End set date

echo day in 'DD' format is %dd%; month in 'MM' format is %mm%; year in 'YYYY' format is %yy%

Переменные%dd%, %mm% и%yy% сохранят день (формат "DD"), месяц (формат "MM") и год (формат "YYYY") соответственно.

Чтобы получить год, месяц и день, вы можете использовать %date% переменная среды и :~ оператор. %date% расширяется до чего-то вроде чт 08/12/2010 и :~ позволяет подобрать определенные символы из переменной:

set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set filename=%year%_%month%_%day%

использование %time% аналогичным образом, чтобы получить то, что вам нужно от текущего времени.

set /? даст вам больше информации об использовании специальных операторов с переменными.

Следующий пакетный код возвращает компоненты текущей даты независимо от локали и сохраняет день, месяц и год в переменных CurrDay, CurrMonth а также CurrYearсоответственно:

for /F "skip=1 delims=" %%F in ('
    wmic PATH Win32_LocalTime GET Day^,Month^,Year /FORMAT:TABLE
') do (
    for /F "tokens=1-3" %%L in ("%%F") do (
        set CurrDay=0%%L
        set CurrMonth=0%%M
        set CurrYear=%%N
    )
)
set CurrDay=%CurrDay:~-2%
set CurrMonth=%CurrMonth:~-2%
echo Current day  :  %CurrDay%
echo Current month:  %CurrMonth%
echo Current year :%CurrYear%

Есть два вложенных for /F циклы, чтобы обойти проблему с wmic команда, вывод которой в формате Юникод; использование одного цикла приводит к появлению дополнительных символов возврата каретки, что влияет на правильное расширение переменной.

Поскольку день и месяц также могут состоять только из одной цифры, я добавил начальный ноль 0 в конструкции петли. После этого значения обрезаются так, чтобы они всегда состояли из двух цифр.

echo %Date:~7,2% gets current day

7 - начальная позиция 2 количество цифр для отображения

echo %Date:~7,2% gets current day

echo %Date:~4,2% gets current month

echo %Date:~10,4% gets current year

НЕЗАВИСИМОСТЬ ЯЗЫКА:

Решение Andrei Coscodan зависит от языка, поэтому попытаться исправить это - зарезервировать все теги для каждого поля: год, месяц и день на целевых языках. Рассмотрим португальский и английский, после разбора сделаем окончательный набор как:

set Year=%yy%%aa%
set Month=%mm%
set Day=%dd%

Посмотрите на настройку года, я использовал оба тега из английского и португальского, у меня это сработало в Бразилии, где эти два языка наиболее распространены в установках Windows. Я ожидаю, что это будет работать и для некоторых языков с латинским происхождением, таких как французский, испанский и так далее.

Ну, полный сценарий может быть:

@echo off
setlocal enabledelayedexpansion

:: Extract date fields - language dependent
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (
        set v1=%%i& set v2=%%j& set v3=%%k
        if "%%i:~0,1%%" gtr "9" (set v1=%%j& set v2=%%k& set v3=%%l)

        for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo.^|date') do (
            set %%m=!v1!& set %%n=!v2!& set %%o=!v3!
    )
)

:: Final set for language independency (English and Portuguese - maybe works for Spanish and French)
set year=%yy%%aa%
set month=%mm%
set day=%dd%


:: Testing
echo Year:[%year%] - month:[%month%] - day:[%day%]

endlocal
pause

Надеюсь, это поможет кому-то, имеющему дело с разными языками.

Единственный надежный способ, которым я знаю, - это использовать VBScript для выполнения тяжелой работы за вас. Не существует переносимого способа получения текущей даты в пригодном для использования формате только с помощью пакетного файла. Следующий файл VBScript

Wscript.Echo("set Year=" & DatePart("yyyy", Date))
Wscript.Echo("set Month=" & DatePart("m", Date))
Wscript.Echo("set Day=" & DatePart("d", Date))

и этот пакетный фрагмент

for /f "delims=" %%x in ('cscript /nologo date.vbs') do %%x
echo %Year%-%Month%-%Day%

должно работать, хотя.

Хотя вы можете получить текущую дату в командном файле с date /t или %date% псевдо-переменные, оба следуют текущей локали в том, что они отображают. Это означает, что вы можете получить дату потенциально в любом формате, и у вас нет возможности ее проанализировать.

Этот вариант работает для всех локализаций:

@echo off
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    if "%%B" NEQ "" (
        SET /A FDATE=%%F*10000+%%D*100+%%A
    )
)
@echo on
echo date=%FDATE%
echo year=%FDATE:~2,2%
echo month=%FDATE:~4,2%

Я перешел на использование вызовов Powershell для этой цели в своих скриптах. Для этого требуется разрешение на выполнение сценария, и это, безусловно, самый медленный вариант. Однако он также не зависит от локализации, его очень легко писать и читать, и гораздо удобнее выполнять корректировку даты, например, сложение / вычитание или получение последнего дня месяца и т. Д.

Вот как получить день, месяц и год

for /f %%i in ('"powershell (Get-Date).ToString(\"dd\")"') do set day=%%i
for /f %%i in ('"powershell (Get-Date).ToString(\"MM\")"') do set month=%%i
for /f %%i in ('"powershell (Get-Date).ToString(\"yyyy\")"') do set year=%%i

Или вот вчерашняя дата в формате гггг-мм-дд

for /f %%i in ('"powershell (Get-Date).AddDays(-1).ToString(\"yyyy-MM-dd\")"') do set yesterday=%%i

День недели

for /f %%d in ('"powershell (Get-Date).DayOfWeek"') do set DayOfWeek=%%d

Текущее время плюс 15 минут

for /f %%i in ('"powershell (Get-Date).AddMinutes(15).ToString(\"HH:mm\")"') do set time=%%i

За одну строчку!


Попробуйте использовать для wmic OS Get localdatetime^|find "." в for /f без tokens и / или delims, это работает на любом языке / регионе, а также никакие пользовательские настройки не влияют на макет вывода.

  • В командной строке:
for /f %i in ('wmic OS Get localdatetime^|find "."')do @cmd/v/c "set _date=%i &echo= year: !_date:~0,4!&&echo=month:   !_date:~4,2!&echo=  day:   !_date:~6,2!"

  • В файле bat/cmd:
for /f %%i in ('wmic OS Get localdatetime^|find "."')do @cmd/v/c "set _date=%%i &echo= year: !_date:~0,4!&&echo=month:   !_date:~4,2!&echo=  day:   !_date:~6,2!"

Полученные результаты:


 year: 2019
month:   06
  day:   12

  • С часами и минутами в файле bat/cmd:
for /f %%i in ('wmic OS Get localdatetime^|find "."')do @cmd/v/c "set _date=%%i &echo=  year: !_date:~0,4!&&echo= month:   !_date:~4,2!&echo=   day:   !_date:~6,2!&echo=  hour:   !_date:~8,2!&echo=minute:   !_date:~10,2!"

  • С часами и минутами в командной строке:
for /f %i in ('wmic OS Get localdatetime^|find "."')do @cmd/v/c "set _date=%i &echo=  year: !_date:~0,4!&&echo= month:   !_date:~4,2!&echo=   day:   !_date:~6,2!&echo=  hour:   !_date:~8,2!&echo=minute:   !_date:~10,2!"

Полученные результаты:


  year: 2020
 month:   05
   day:   16
  hour:   00
minute:   46

Я думаю, что ответ Андрея Коскодана является лучшим, когда вы не можете сделать много предположений. Но иногда наличие однострочника - это хорошо, если вы можете сделать некоторые предположения. Это решение предполагает, что date \t вернет один из двух форматов. В WindowsXP "date / t" возвращает "23.11.2011", а в Windows7 - "23.11.2011".

FOR /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set mm=%%a&set dd=%%b&set yyyy=%%c& (if "%%a:~0,1" gtr "9" set mm=%%b&setdd=%%c&set yyyy=%%d))
:: Test results
echo day in 'DD' format is '%dd%'; month in 'MM' format is '%mm%'; year in 'YYYY' format is '%yyyy%'

Спасибо Андре Консодан за ответ, чтобы помочь мне с этим решением в одну строку.

Извлечь день, месяц и год

Функция с наибольшим количеством голосов и принятая НЕ работают независимо от локали, так как команда DATE также подлежит локализации. Например (принятый): на английском языке у вас YYYY на год, а в Голландии это JJJJ. Так что это не пойдет. Следующий скрипт берет локализацию пользователей из реестра, который не зависит от локали.

@echo off

::: Begin set date
setlocal EnableExtensions EnableDelayedExpansion

:: Determine short date format (independent from localization) from registry
for /f "skip=1 tokens=3-5 delims=- " %%L in ( '2^>nul reg query "HKCU\Control Panel\International" /v "sShortDate"' ) do ( 

    :: Since we can have multiple (short) date formats we only use the first char from the format in a new variable
    set "_L=%%L" && set "_L=!_L:~0,1!" && set "_M=%%M" && set "_M=!_M:~0,1!" && set "_N=%%N" && set "_N=!_N:~0,1!"

    :: Now assign the date values to the new vars
    for /f "tokens=2-4 delims=/-. " %%D in ( "%date%" ) do ( set "!_L!=%%D" && set "!_M!=%%E" && set "!_N!=%%F" )
)


:: Print the values as is
echo.
echo This is the original date string --^> %date%
echo These are the splitted values    --^> Day: %d%, Month:%m%, Year: %y%.
echo.

endlocal

Извлекайте только год

Для сценария, который я написал, я хотел только извлечь год (не зависящий от локали), поэтому я придумал этот oneliner, так как не мог найти никакого решения. Он использует переменную "DATE", несколько разделителей и проверяет число больше 31. Тогда это будет текущий год. Это мало ресурсов в отличие от некоторых других решений.

@echo off

setlocal EnableExtensions

for /f " tokens=2-4 delims=-./ " %%D in ( "%date%" ) do ( if %%D gtr 31 ( set "_YEAR=%%D" ) else ( if %%E gtr 31 ( set "_YEAR=%%E" ) else ( if %%F gtr 31 ( set "_YEAR=%%F" ) ) ) )

echo And the year is... %_YEAR%.
echo.

endlocal

Вы можете использовать простой синтаксис переменных, вот пример:

@echo off
set month=%date:~0,2%
set day=%date:~3,2%
set year=%date:~6,4%
echo The current month is %month%
echo The current day is %day%
echo The current year is %year%
pause >nul

Другой вариант - это forкоманда, снова вот мой пример:

@echo off
for /f "delims=/ tokens=1-3" %%a in ("%date%") do (
set month=%%a
set day=%%b
set year=%%c
)
echo The current month is %month%
echo The current day is %day%
echo The current year is %year%
pause >nul

Основываясь на замечательных ответах выше, я хотел бы добавить этот вариант как однострочник, который просто присваивает год переменной среды%year%:

for /f "skip=1 tokens=2 delims==" %%y in ('wmic PATH Win32_LocalTime GET Year /value') do set year=%%y

Чтобы установить переменную Day в пакетном скрипте, просто используйте

      FOR /F %%F IN ('date.exe +%%d') DO SET Day=%%F

где находится в пакете GnuWin32 coreutils. Действуйте аналогично для месяца и года. Это решение не зависит от локализации. Вы можете использовать UnxUtils вместо GnuWin32, а также другие альтернативы. Никакой настройки не требуется. Просто скопируйте date.exe там, где вам это нужно.

powershell Set-Date -Da (Get-Date -Y 1980 -Mon 11 -Day 17)
Другие вопросы по тегам