@ECHO OFF ECHO. :: Check Windows version (XP Pro or later) IF NOT "%OS%"=="Windows_NT" GOTO Syntax :: Check command line argument (one mandatory) IF "%~1"=="" GOTO Syntax IF NOT "%~2"=="" GOTO Syntax :: Check if help is required ECHO.%1 | FINDSTR.EXE /R /C:"[/?\.]" >NUL && GOTO Syntax :: Check if WMIC is available WMIC.EXE Alias /? >NUL 2>&1 || GOTO Syntax :: Localize variables SETLOCAL ENABLEDELAYEDEXPANSION :: Reset/initialize the variables used SET DatePart= SET Day= SET Month= SET Year= SET Error=0 :: Fill array with valid arguments SET DatePart.d=Day SET DatePart.Day=Day SET DatePart.h=Hour SET DatePart.Hour=Hour SET DatePart.l=LeapYear SET DatePart.LeapYear=LeapYear SET DatePart.m=Month SET DatePart.Month=Month SET DatePart.n=Minute SET DatePart.Minute=Minute SET DatePart.q=Quarter SET DatePart.Quarter=Quarter SET DatePart.s=Second SET DatePart.Second=Second SET DatePart.w=DayOfWeek SET DatePart.DayOfWeek=DayOfWeek SET DatePart.ww=WeekOfYear SET DatePart.WeekOfYear=WeekOfYear SET DatePart.y=DayOfYear SET DatePart.DayOfYear=DayOfYear SET DatePart.yyyy=Year SET DatePart.Year=Year :: Get current day, month, year and determine if we have a leap year CALL :Today CALL :LeapYear ECHO.!DatePart.%~1! | FIND /I "OfYear" >NUL && ( CALL :DayOfYear CALL :WeekOfYear ) :: Check if command line argument is listed in array SET DatePart. | FINDSTR /R /I /C:"\.%~1=" >NUL IF ERRORLEVEL 1 ( ENDLOCAL GOTO Syntax ) :: If the value is already stored in a variable use that variable, otherwise use WMIC. IF DEFINED !DatePart.%~1! ( SET DP=!DatePart.%~1! CALL SET DatePart=%%!DP!%% ) ELSE ( FOR /F "skip=1" %%A IN ('WMIC Path Win32_LocalTime Get !DatePart.%~1! /Format:table 2^>NUL ^|^| SET Error=1') DO ( IF "!DatePart!"=="" SET DatePart=%%A ) ) :: Display result ECHO.%DatePart% :: Check for errors trapped by WMIC IF "%Error%"=="1" ( ENDLOCAL GOTO Syntax ) :: Done ENDLOCAL & SET DatePart=%DatePart% EXIT /B %DatePart% :DayOfYear :: Fill array with cumulative number of days of past months SET /A DaysPast.1 = 0 SET /A DaysPast.2 = %DaysPast.1% + 31 SET /A DaysPast.3 = %DaysPast.2% + 28 + %LeapYear% SET /A DaysPast.4 = %DaysPast.3% + 31 SET /A DaysPast.5 = %DaysPast.4% + 30 SET /A DaysPast.6 = %DaysPast.5% + 31 SET /A DaysPast.7 = %DaysPast.6% + 30 SET /A DaysPast.8 = %DaysPast.7% + 31 SET /A DaysPast.9 = %DaysPast.8% + 31 SET /A DaysPast.10 = %DaysPast.9% + 30 SET /A DaysPast.11 = %DaysPast.10% + 31 SET /A DaysPast.12 = %DaysPast.11% + 30 SET /A DayOfYear = !DaysPast.%Month%! + %Day% GOTO:EOF :LeapYear SET LeapYear=0 SET /A "Test = %Year% %% 4" IF %Test% EQU 0 SET LeapYear=1 SET /A "Test = %Year% %% 100" IF %Test% EQU 0 SET LeapYear=0 SET /A "Test = %Year% %% 400" IF %Test% EQU 0 SET LeapYear=1 GOTO:EOF :Today FOR /F "skip=1 tokens=1-4" %%A IN ('WMIC Path Win32_LocalTime Get Day^,DayOfWeek^,Month^,Year /Format:table 2^>NUL ^|^| SET Error=1') DO ( IF "!Day!"=="" SET Day=%%A IF "!DayOfWeek!"=="" SET DayOfWeek=%%B IF "!Month!"=="" SET Month=%%C IF "!Year!"=="" SET Year=%%D ) IF %DayOfWeek% EQU 0 SET DayOfWeek=7 GOTO:EOF :WeekOfYear SET /A ThisWeeksSunday = %DayOfYear% - %DayOfWeek% + 7 SET /A WeekOfYear = %ThisWeeksSunday% / 7 SET /A FirstThursday = %ThisWeeksSunday% - 7 * %WeekOfYear% + 4 IF %FirstThursday% GTR 7 SET /A WeekOfYear -= 1 GOTO:EOF :Syntax ECHO DatePart.bat, Version 3.01 for Windows XP Professional and later ECHO Returns the specified part of the current date or time ECHO. ECHO Usage: DATEPART option ECHO. ECHO Option: d or Day Returns: day of month ECHO h or Hour hour ECHO l or LeapYear leap year (1 if true, 0 if not) ECHO m or Month month ECHO n or Minute minutes ECHO q or Quarter quarter ECHO s or Second seconds ECHO w or DayOfWeek day of week ECHO ww or WeekOfYear ISO week number ECHO y or DayOfYear day of year ECHO yyyy or Year year ECHO. ECHO Notes: All values are numeric, without leading zeros, and are returned ECHO on screen, as "errorlevel" and in variable %%DatePart%%. ECHO Week 0 means the last week (52 or 53) of the previous year. ECHO. ECHO Written by Rob van der Woude ECHO http://www.robvanderwoude.com