Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

Чтобы получить год, месяц и день, вы можете использовать переменную среды %date% и оператор :~. %date% расширяется до Thu 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 /? предоставит вам дополнительную информацию об использовании специальных операторов с переменными.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Ну, полный script может быть:

@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

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

Ответ 7

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

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

Ответ 8

Я думаю, что ответ Андрея Коскодана лучший, когда вы не можете сделать много предположений. Но иногда наличие однострочного приятно, если вы можете сделать некоторые предположения. Это решение предполагает, что "date\t" вернет один из двух форматов. В WindowsXP "date/t" возвращается "11/23/2011", но в Windows7 он возвращает "Wed 11/23/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%'

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

Ответ 9

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

Функция с наибольшим количеством голосов и принятая НЕ работают независимо от локали, так как команда 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

Ответ 10

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

Ответ 11

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

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

@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!"

Ответ 12

powershell Set-Date -Da (Get-Date -Y 1980 -Mon 11 -Day 17)

Ответ 13

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

@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