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