@REM - CheckParameters.BAT (23 Jun 2024 // 30 Jun 2024 / 23 Jun 2024): How to Check Parameters -- Native vs 3rd Party @ECHO OFF ::: If you want to check for a parameter of /X or -X, the use the following format: ::: CALL :GetParams "X EXTENDED" & IF DEFINED #OK (execute whatever commands you want here) ::: ::: You would call this from the command-line as: ::: CheckParameters.BAT /X ::: CheckParameters.BAT -X ::: ----------------------------------------------- ::: ::: If you want to check for a parameter of /X or -X that contains a value, then use the following format: ::: CALL :GetParams "X EXTENDED" #X_VARIABLE & IF DEFINED #X_VARIABLE (execute whatever commands you want here) ::: ::: You would call this from the command-line as: ::: CheckParameters.BAT /X:1 ::: CheckParameters.BAT /X:NoSpaces ::: CheckParameters.BAT /X:"Value with Spaces" ::: ::: You can do this natively or with a 3rd party utility that really streamlines the process. ::: I use this for pretty much all of my major scripts. ::: ::: The :FoundParam routine is just here for testing. Not needed for production at all. ::: All you need for this to work is the variable block, and EITHER :GetParams OR :GetParams2 ::: ::: Full script can be found here ..... https://pastebin.com/wjs4Hz5k ::: Script without debug info ......... https://pastebin.com/5zAGAyrL ::: ::: I started my testing with: CheckParameters.BAT /H /S /SHOW /L:C:\TEMP\TEST.TXT ::: :Variables SETLOCAL ENABLEDELAYEDEXPANSION SET #ALL_PARAMS=%* SET #DIVIDER=-------------------------------------------------------------------- rem ---------------------------------------------------------------------------------------------- rem -- Process Special Command-line Parameters Natively rem ---------------------------------------------------------------------------------------------- ::: Loop through all provided command-line parameters, and run the native ::: subroutine to see if that parameter is a valid one FOR %%P IN (%#ALL_PARAMS%) DO CALL :GetParams %%P ::: Check through the %#SYNTAX% variable when all parameter parsing is done, ::: and if there are any "F" entries set, then you received a bad parameter. ::: You can decide if you actually want to do anything about that. FOR %%S IN (%#SYNTAX%) DO IF "%%~S"=="F" (ECHO *** ERROR: Invalid parameters provided ***) ::: If the %#LOGFILE% variable wasn't set by specific parameter, set it to ::: the first parameter. You can test its validity later. IF NOT DEFINED #LOGFILE (SET #LOGFILE="%~1") ECHO %#DIVIDER% rem ---------------------------------------------------------------------------------------------- rem -- Process Special Command-line Parameters via CHECKPARAMS.EXE rem ---------------------------------------------------------------------------------------------- ::: The paradigm for using CHECKPARAMS.EXE is different. Here, you're going ::: to call the subroutine once for each valid option that you want to search ::: for, and if it is found in the list, then %#OK% will be set to some value, ::: and you can check for that immediately after you make that call. It's a ::: little easier to control precedence of selected parameters this way. CALL :GetParams2 "S SHOW" & IF DEFINED #OK (SET #SHOW=TRUE) CALL :GetParams2 "H HELP ?" & IF DEFINED #OK (SET #HELP=TRUE) ::: The following syntax allows you to not only check for specific parameters, ::: but it captures the provided value into a specific variable, which you can ::: then test for immediately. CALL :GetParams2 "L LOGFILE" #LOGFILE & IF NOT DEFINED #LOGFILE (SET #LOGFILE="%~1") CALL :GetParams2 "D DIR DIRECTORY" #DIRECTORY & IF NOT DEFINED #DIRECTORY (ECHO No Directory was selected) ECHO %#DIVIDER% rem -- Test Your Parameters :Testing ECHO: ECHO Setup your parameters above, and then test them by calling this script ECHO with your desired parameters. Remember that "-" and "/" are both valid ECHO option delimiters. For compound options, use ":" as the separator ECHO between the option and the value. ECHO: ECHO Valid parameters for this test are as follows: ECHO %~n0 /S ECHO %~n0 /SHOW ECHO %~n0 /H ECHO %~n0 /? ECHO %~n0 /HELP ECHO %~n0 /L:C:\Temp\LogFile.TXT ECHO %~n0 /LOGFILE:"%TEMP%\LogFile.TXT" ECHO %~n0 "%TEMP%\LogFile.TXT" ECHO {you can make the logfile take on the 1st param if not /L is found} ECHO %~n0 /D:%WINDIR% ECHO %~n0 /DIR:"%WINDIR%" ECHO %~n0 /DIRECTORY:"%~dp0" ECHO: FOR %%P IN (LOGFILE DIRECTORY) DO IF NOT DEFINED #%%P ECHO *** ERROR: #%%P was not defined :ExitBatch ENDLOCAL GOTO :EOF rem -- SUBROUTINE: Use Native Batch Commands to Capture Selected Parameters :GetParams rem %1 = Parameter to Evaluate ::: If you decide to use this routine, be sure to remove every instance of the ::: following: '& CALL :FoundParam GetParams "%#PREFIX%" "%#SUFFIX%"' from ::: the lines below (after testing), or just look at the production (non-debug) ::: version of the script found here: https://pastebin.com/5zAGAyrL SET #OK= SET #PREFIX=%~1 SET #SUFFIX= IF NOT DEFINED #PREFIX GOTO :EOF ::: With each parameter you parse, start by stripping all doublequotes from ::: the parameter. Next, attempt to determine if it is a compound parameter ::: by searching for a ":" character, and making the part before the ":" as ::: the prefix, and the portion after the ":" as the suffix. SET #PREFIX=!#PREFIX:"=! FOR /F "TOKENS=1* DELIMS=:" %%a IN ('ECHO !#PREFIX!') DO ( SET #PREFIX=%%~a SET #SUFFIX=%%~b ) ::: Now, check for both a leading "/" or "-", compare the parameter you are ::: currently evaluating, with one of the valid parameters (case-insensitive) ::: and decide what you will do if it is the one you have found. FOR %%d IN (/ -) DO ( FOR %%O IN (S SHOW) DO ( IF /I "%#PREFIX%"=="%%d%%O" (SET #OK=T& SET #SUFFIX=.& SET #SHOW=TRUE& CALL :FoundParam GetParams "%#PREFIX%" "%#SUFFIX%") ) FOR %%O IN (H HELP) DO ( IF /I "%#PREFIX%"=="%%d%%O" (SET #OK=T& SET #SUFFIX=.& SET #HELP=TRUE& CALL :FoundParam GetParams "%#PREFIX%" "%#SUFFIX%") ) FOR %%O IN (L LOGFILE) DO ( IF /I "%#PREFIX%"=="%%d%%O" (SET #OK=T& SET #LOGFILE=%#SUFFIX%& CALL :FoundParam GetParams "%#PREFIX%" "%#SUFFIX%") ) FOR %%O IN (D DIR DIRECTORY) DO ( IF /I "%#PREFIX%"=="%%d%%O" (SET #OK=T& SET #DIRECTORY=%#SUFFIX%& CALL :FoundParam GetParams "%#PREFIX%" "%#SUFFIX%") ) ) ::: If you get to the end of the valid parameter list, and %#OK% has not yet ::: been set to "T", then this means that the parameter you have just parsed ::: is an invalid one. You'll get to deal with this when all parameter ::: processing has been completed. IF NOT DEFINED #SUFFIX SET #OK=F SET #SYNTAX=%#OK%;%#SYNTAX% GOTO :EOF rem -- SUBROUTINE: Use CheckParams.exe (3rd party util) to Capture Selected Parameters rem -- https://www.majorgeeks.com/files/details/checkparams.html :GetParams2 rem %1 = Parameters to Search For rem %2 = Variable to Set SET #OK=& IF "%~1"=="" GOTO :EOF ::: As mentioned earlier, this subroutine is called with one valid entry that ::: needs to be searched for from the entire list of parameters provided by ::: the user at the command-line. For more explanation of CHECKPARAMS, type ::: the following at a command prompt: CHECKPARAMS /?? FOR /F "TOKENS=2-3*" %%v IN ('CHECKPARAMS -q -a -c "%~1" -s %#ALL_PARAMS% 2^>NUL') DO IF /I "%%~v"=="TRUE" ( SET #OK=T IF NOT "%~2"=="" SET %~2=%%~x rem ::: This following call to :FoundParam is just here for testing, and rem ::: should be removed for production purposes, or the production rem ::: version of the script be used instead... CALL :FoundParam GetParams2 "%%~w" "%%~x" ) GOTO :EOF rem -- SUBROUTINE: Display What Parameter You Found :FoundParam rem %1 = Subroutine called from rem %2 = Parameter Found rem %3 = Parameter Value Found SET #ZZ=%~2 SET #ZZ=!#ZZ:[=! SET #ZZ=!#ZZ:]=! ECHO: ECHO Subroutine being tested ....... %~1 ECHO Parameters you provided ....... %#ALL_PARAMS% ECHO Valid parameter found ......... !#ZZ! ECHO Valid parameter value found ... %3 GOTO :EOF