Как получить день месяца и год из сценария Windows cmd.exe? - PullRequest
33 голосов
/ 13 августа 2010

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

Ответы [ 13 ]

33 голосов
/ 13 августа 2010

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

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

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

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

26 голосов
/ 29 октября 2015

Следующий пакетный код возвращает компоненты текущей даты независимо от локали и сохраняет день, месяц и год в переменных 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.После этого значения обрезаются так, чтобы они всегда состояли из двух цифр.

22 голосов
/ 13 августа 2010

Вариант сценария, который работает независимо от локали.Поместите его в текстовый файл с расширением .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) соответственно.

13 голосов
/ 08 ноября 2014
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
9 голосов
/ 20 февраля 2012

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

Решение 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

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

6 голосов
/ 06 июля 2017

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

@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%
6 голосов
/ 13 августа 2010

Единственный надежный способ, которым я знаю, - это использовать 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%, обе они следуют текущей локали в том, что они отображают. Это означает, что вы получаете дату в потенциально любом формате, и у вас нет возможности ее проанализировать.

2 голосов
/ 03 ноября 2011

Я думаю, что ответ Андрея Коскодана - лучший, когда вы не можете сделать много предположений. Но иногда наличие однострочного хорошо, если вы можете сделать некоторые предположения. В этом решении предполагается, что 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%'

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

0 голосов
/ 12 июня 2019
  • За одну строку!

Попробуйте использовать для зацикливания с двумя разделителями (равно + точка): =.:

@for /f "tokens=2delims==." %i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')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
  • Работает на любом языке / регионе, а также без пользовательских настроек в макете вывода.

Для файла летучей мыши:


@for /f "tokens=2delims==." %%i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do @cmd/v/c "set _date=%%i &&echo/ year: !_date:~0,4!&&echo/month:   !_date:~4,2!&&echo/  day:   !_date:~6,2!"

0 голосов
/ 11 июня 2019

Я перешел на использование вызовов 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

...