Batch Script: Validate Date Input
batch-file, date, validation, windows
Solution
The Batch file below check that the inserted date have the right format and that it represent a valid date, that is, that have the right number of days in each month, even for February on leap years!
@echo off
setlocal EnableDelayedExpansion
set i=0
for %%a in (31 28 31 30 31 30 31 31 30 31 30 31) do (
set /A i+=1
set dpm[!i!]=%%a
)
set /P "inDate=Please insert date (MM-DD-YYYY format): "
if "%inDate:~2,1%%inDate:~5,1%" neq "--" goto invalidDate
for /F "tokens=1-3 delims=-" %%a in ("%inDate%") do set "MM=%%a" & set "DD=%%b" & set "YYYY=%%c"
ver > NUL
set /A month=1%MM%-100, day=1%DD%-100, year=1%YYYY%-10000, leap=year%%4 2>NUL
if errorlevel 1 goto invalidDate
if not defined dpm[%month%] goto invalidDate
if %leap% equ 0 set dpm[2]=29
if %day% gtr !dpm[%month%]! goto invalidDate
if %day% lss 1 goto invalidDate
echo Date correct: %YYYY%-%MM%-%DD%
goto :EOF
:invalidDate
echo Bad date
Problem
I have a batch file that I use to create new project folders for clients that walks a user through the creation process and adds the appropriate files and folders to a central location. I need to add an input section so they can put a date (not always current date) in and it is included in the naming of the files. The issue I have, and I have hunted high and low and can't find my answer, is that I need to dummy proof the date input. I want the user to input the date in the `MM-DD-YYYY` format including dashes. It needs to then format it into `YYYY-MM-DD`. It needs to be smart enough that it forces the user to use the required format of `MM-DD-YYYY`; has to be numbers and dashes, no slashes, the right amount of characters, and so forth. I haven't been able to find anything close to even remotely get me where I need to be so I am asking the awesome geniuses out there for help in this regard as it is driving me up a wall. Below is my script code. I need this input to go right after the job type is selected. `"Please insert date (MM-DD-YYYY format): "` ``` @echo off setlocal EnableDelayedExpansion set version=7.95 set projectpath="P:" set workbookpath="\\server2\Documents\Blanks (DO NOT EDIT)\dryingworkbook_v3r75.xls" set questions="\\server2\Documents\Blanks (DO NOT EDIT)\Abatement and Mold Questions.txt" set notes="\\server2\Documents\Blanks (DO NOT EDIT)\Job Notes.docx" set info="\\server2\Documents\Blanks (DO NOT EDIT)\Job Information.docx" set bizname=1 ECHO =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ECHO = Welcome to SERVPRO Project Creation Wizard v%version% = ECHO =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ECHO. :sof ECHO. ECHO Is this new project for a Residential or Commercial job? :loopJobType SET /P jobtype=Enter [r] for Residential or [c] for Commercial: ECHO. IF "%jobtype%" == "r" GOTO :loopResidential IF "%jobtype%" == "R" GOTO :loopResidential IF "%jobtype%" == "c" GOTO :loopCommercial IF "%jobtype%" == "C" GOTO :loopCommercial GOTO :loopJobType :loopResidential ECHO You have chosen to create a new Residential job project. ECHO. set type=1 GOTO :loopFirstName :loopCommercial ECHO You have chosen to create a new Commercial job project. ECHO. set type=2 SET /p bizname=Please enter the business name: ECHO. IF "%bizname%"=="" GOTO :loopCommercial :loopFirstName SET /P FirstName=Please enter the insured's first name: IF "%FirstName%"=="" GOTO :loopFirstName call :format FirstName :loopLastName ECHO. SET /P LastName= Please enter the insured's last name: IF "%LastName%"=="" GOTO :loopLastName call :format LastName SET FullName=%LastName%, %FirstName% SET FullBizName=%bizname% (%FullName%) goto :ConfirmProject :format set Name=!%1! set Head=%Name:~0,1% set Tail=%Name:~1% for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set Head=!Head:%%a=%%a! for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set Tail=!Tail:%%a=%%a! set %1=%Head%%Tail% GOTO :eof :ConfirmProject ECHO. IF "%type%" == "1" SET /P yesno=Are you sure you want to add "%FullName%" to the Project directory? [y/n] IF "%type%" == "2" SET /P yesno=Are you sure you want to add "%FullBizName%" to the Project directory? [y/n] IF "%yesno%" == "y" GOTO :CreateProject IF "%yesno%" == "Y" GOTO :CreateProject IF "%yesno%" == "n" GOTO :sof IF "%yesno%" == "N" GOTO :sof GOTO :ConfirmProject :CreateProject IF "%type%" == "1" SET ProjectName=%FullName% IF "%type%" == "2" SET ProjectName=%FullBizName% :: Create a folder containing a new project. mkdir "%projectpath%\%ProjectName%" ECHO. ECHO. ECHO Creating a Project directory for "%ProjectName%" ... :: Create a folder within said project that will contain job documents. ECHO Creating a Documents directory for "%ProjectName%" ... mkdir "%projectpath%\%ProjectName%\Documents" :: (Taken out of use 7-15-13) ECHO Adding a Job Information file for "%ProjectName%" ... :: (Taken out of use 7-15-13) copy /-Y %info% "%projectpath%\%ProjectName%\Documents\Job Information - %ProjectName%.docx" ECHO Documents directory creation for "%ProjectName%" finished ... :: Create a folder within said project that will contain drying workbook(s). ECHO Creating a Drying Workbook directory for "%ProjectName%" ... mkdir "%projectpath%\%ProjectName%\Drying Workbooks" :: Copy a new blank workbook to the project workbook directory and give it the proper name. ECHO Adding a Drying Workbook for "%ProjectName%" ... copy /-Y %workbookpath% "%projectpath%\%ProjectName%\Drying Workbooks\DRY 1_%ProjectName%.xls" ECHO Adding an Abatement and Mold Questions file for "%ProjectName%" ... copy /-Y %questions% "%projectpath%\%ProjectName%\Drying Workbooks\Abatement and Mold Questions.txt" ECHO Drying Workbook directory creation for "%ProjectName%" finished ... :: Create a folder within said project that will contain original photos. ECHO Creating a Photos directory for "%ProjectName%" ... mkdir "%projectpath%\%ProjectName%\"Photos :: Create a folder within said project photo folder that will contain resized photos. mkdir "%projectpath%\%ProjectName%\Photos\Resized" mkdir "%projectpath%\%ProjectName%\Photos\Upload" ECHO Photos directory creation for "%ProjectName%" finished ... :: Add in Job Notes file. ECHO Adding a Job Notes files for "%ProjectName%" ... copy /-Y %notes% "%projectpath%\%ProjectName%\Job Notes - %ProjectName%.docx" :: Log the creation of the project. FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set date=%%a%%b%%c) echo off > "%projectpath%\Logs\%ProjectName% - [Project Created %date% by %computername%].txt" ECHO Logging "%ProjectName%" creation date and time... ECHO Project directory creation for "%ProjectName%" finished ... GOTO :OpenProject :OpenProject :: Ask if the project should be opened now. If so open and close script, else close script. set /p reply=Do you want to open the "%ProjectName%" project now? [y/n] if "%reply%" == "y" %SystemRoot%\explorer.exe "%projectpath%\%ProjectName%" IF "%yesno%" == "Y" %SystemRoot%\explorer.exe "%projectpath%\%ProjectName%" GOTO :eof IF "%yesno%" == "n" GOTO :No IF "%yesno%" == "N" GOTO :No exit :No ECHO. ECHO. ECHO You have successfully created a new project for %ProjectName%. ECHO. ECHO Press any key to exit . . . PAUSE>NUL :eof ```