GetOpt - Process Command Line Options

#1
Many years ago I created a GetOpt batch file so that I could process command line arguments effectively. I've posted this before, but you can read much more about how this works at the following link:

https://bitbucket.org/frossm/getopt.btm

I use this extensively in my batch files and library functions. I have since updated this to work as a library function and the code is below. This is my favorite function and if anyone has ideas or thoughts, please let me know. There is a full readme on how to use this at the above link. It's easy, but you have to know how it works.

Code:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: GetOpt - Process command line options                                  Michael Fross
::                                                                        [email protected]
::                                                                     http://fross.org
:: Please see the README.txt / README.md for usage information
:: Latest version:    https://bitbucket.org/frossm/getopt.btm
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
GetOpt {
    :: -----------------------------------------------------------------------------------------
    :: Configuration Directives
    :: -----------------------------------------------------------------------------------------
    :: Set UseColorOutput to 0 it disable color output while in debug mode
    set UseColorOutput=1
    
    :: Set the debug color.  Options are RED, CYAN, YELLOW, MAGENTA, WHITE, GREEN, BLACK, BLUE
    set DebugColor=RED
    set DebugHeaderFooterColor=WHITE
    
    
    :: -----------------------------------------------------------------------------------------
    :: Start of script execution
    :: -----------------------------------------------------------------------------------------
    :: Clean up and prep the environment before we get going
    unset getopt* OPTION_* PARAM_*
    set getopt_ParmCounter=1
    set getopt_TotalArgs=%@Words[" ",%*]
    
    :: If in debug mode, kick off the display by showing the number of arguments
    iff defined DEBUG then
        gosub SetColor %DebugHeaderFooterColor
        echo.
        echo --- GetOpt Debug Mode Activated ------------------------------------------------
    
        :: Set the color of the debug output
        gosub SetColor %DebugColor
    
        echo.
        echo Working with command line:
        echo   %*
        echo.
        echo GetOpt is processing %getopt_TotalArgs arguments:
    endiff
    
    :: Loop through all command line arguments one at a time.
    do i = 1 to %getopt_TotalArgs
        :: Empty the index variables
        unset getopt_ColonIdx getopt_EqualIdx getopt_ValueIdx
    
        :: Set getopt_Current to the current argument text we are working with
        set getopt_Current=%@Word[%@Dec[%i],%*]
    
        if defined DEBUG (echo. %+ echo Scan #%i: %getopt_Current)
    
        :: If first character starts with a - or / it must be an option
        iff %@instr[0,1,%getopt_Current] == - .or. %@instr[0,1,%getopt_Current] == / then
            set getopt_Parm=%getopt_Current
            if defined DEBUG echo  - Item is a switch or option
    
            :: Set the Colon Index to the position of the colon.  0 means none was found
            set getopt_ColonIdx=%@index[%getopt_Parm,:]
    
            :: Set the Equal Index to the position of the equalsign.  0 means none was found
            set getopt_EqualIdx=%@index[%getopt_Parm,=]
    
            :: Set the value index to the position of the colon or equal sign
            iff %getopt_ColonIdx ge 0 then
                if defined DEBUG echo  - Found colon at index position: %getopt_ColonIdx
                set getopt_ValueIdx=%getopt_ColonIdx
            elseiff %getopt_EqualIdx ge 0 then
                if defined DEBUG echo  - Found equal sign at index position: %getopt_EqualIdx
                set getopt_ValueIdx=%getopt_EqualIdx
            endiff        
    
            :: If the value index is GE 0 then we must have a colon or equal sign in the option.
            :: set the OPTION value to the stuff to the right of the colon or equal sign
            iff %getopt_ValueIdx ge 0 then
                set getopt_ParmName=%@instr[2, %@Dec[%getopt_ValueIdx] , %getopt_Parm]
                if defined DEBUG echo  - ParmName  = "%getopt_ParmName"
                set getopt_ParmValue=%@right[%@eval[-%getopt_ValueIdx-1],%getopt_Parm]
                if defined DEBUG echo  - Parmvalue = "%getopt_ParmValue"
                set OPTION_%getopt_ParmName=%getopt_ParmValue
            else
                :: This is a switch, so simply set the value to 1
                if defined DEBUG echo  - No colon or equal sign found in "%getopt_Parm"
                set getopt_ParmName=%@right[%@Dec[%@len[%getopt_Parm]],%getopt_Parm]
                set getopt_ParmValue=1
                if defined DEBUG echo  - ParmName = "%getopt_ParmName"
                set OPTION_%getopt_ParmName=%getopt_ParmValue
            endiff
    
            :: Regardless if there was a value or not, display what is going to occur
            if defined DEBUG echo  - Setting Variable OPTION_%getopt_ParmName=%getopt_ParmValue
    
        else
            :: There was no / or - found, therefore this must be a parameter, not an option
            if defined DEBUG echo  - "%getopt_Current" is a parameter, not a switch or option
            set PARAM_%getopt_ParmCounter=%getopt_Current
            set PARAM_0=%getopt_ParmCounter
            if defined DEBUG echo  - Updating Number of Parms.  PARAM_0=%PARAM_0
            if defined DEBUG echo  - Setting Variable PARAM_%getopt_ParmCounter="%getopt_Current"
            set getopt_ParmCounter=%@Inc[%getopt_ParmCounter]
        endiff
    enddo
    
    
    :: Display summary information
    iff defined DEBUG then
        echo.
        iff defined PARAM_0 then
            echo There were %PARAM_0 parameters found.  Setting PARAM_0=%PARAM_0
        else
            echo There were no parameters found.  PARAM_0 has not been set.
        endiff
        echo.
        echo GetOpt has completed processing %getopt_TotalArgs arguments.  Ending Execution.
    
        gosub SetColor %DebugHeaderFooterColor
        echo.
        echo --- End GetOpt Debug Messages -------------------------------------------------
        echo.
    
        :: Reset the color back to normal
        gosub SetColor Normal
    
    endiff
    
    
    :: Perform cleanup and return to the calling program
    unset getopt_* UseColorOutput DebugColor DebugHeaderFooterColor
    
    :: If Debug is set, then pause before passing control back to the calling program
    ::if defined DEBUG pause Press Any Key To Continue To The Calling Program...
    quit
    
    
    :: -----------------------------------------------------------------------------------------
    :: SetColor [Color]
    :: Simple routinethat sets the current console color to what is chosen.  Sending
    :: the color "Normal" will set the color back to the default.
    :: -----------------------------------------------------------------------------------------
    :SetColor [Color]
        iff %UseColorOutput gt 0 then
            Switch %@Upper[%Color]
                Case CYAN
                    echos ^e[36;1m
    
                Case RED
                    echos ^e[31;1m
    
                Case YELLOW
                    echos ^e[33;1m
    
                Case MAGENTA
                    echos ^e[35;1m
    
                Case WHITE
                    echos ^e[37;1m
    
                Case GREEN
                    echos ^e[32;1m
    
                Case BLACK
                    echos ^e[30m
    
                Case BLUE
                    echos ^e[34m
            
                Case NORMAL
                    echos ^e[0m
    
                Default
                    echo ** ERROR Setting Color.  Unknown Directive:  '%Color' **
            EndSwitch
        endiff
    return
}