Как получить день месяца и год из сценария 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
там, где вам это нужно.