Everytime I'd to create a batch to do compilations, or any other kind of stuff I always bumped to the same problem, parsing command line arguments. Usually I ended up with something like:
if "%1"=="-x32" (
Do something for x32
)
if "%2"=="-x32" (
Do something for x32
)
if "%1"=="-x64" (
Do something for x64
)
if "%2"=="-x64" (
Do something for x64
)
This is really bad way to do it, so I decided to spend sometime today and solve the problem once and for all, as a result I finally have a decent way to parse arguments, and I will document it in here in case I need it again or if someone else is struggling to get this for himself. (I love getopts from Linux! but I guess Windows will keep forcing us to this kind of solutions)
@echo off
setlocal enabledelayedexpansion
if [%1] ==[] goto usage
call:parseArguments %*
if "%x32%" == "true" (
echo Well done you set x32 to true
)
if "%x64%" == "true" (
echo Well done you set x64 to true
)
if NOT "%d" == "" (
echo you set the output dir to: %d%
)
GOTO Exit
@rem ================================================================================
@rem Functions
@rem ================================================================================
:usage
Echo Usage: %0 [-x32] [-x64] [-d output-dir]
goto exit
:getArg
set valname=%~1
echo arg: !%valname%!
goto:eof
:parseArguments
rem ----------------------------------------------------------------------------------
@echo off
:loop
IF "%~1"=="" GOTO cont
set argname=%~1
set argname=%argname:~1,100%
set value=%~2
@rem if the next value starts with - then it's a new parameter
if "%value:~0,1%" == "-" (
set !argname!=true
SHIFT & GOTO loop
)
if "%value%" == "" (
set !argname!=true
SHIFT & GOTO loop
)
set !argname!=%~2
@rem jumps first and second parameter
SHIFT & SHIFT & GOTO loop
:cont
goto:eof
rem ----------------------------------------------------------------------------------
:Exit
The magic ocurrs in the "parseArguments" function, (Oh yes, batch files have functions, I didn't know that until now. This page was really helpful: http://www.dostips.com/DtTutoFunctions.php).
This function contains two things that I learned today. The first one: SHIFT, this command shift the arguments putting the second argument in front and the third in second place, and so on. This is really useful if you don't know the number of arguments, so you only need to do something like the following code to print all the arguments:
:loop
IF "%~1"=="" GOTO cont
echo %~1
SHIFT & GOTO loop
:cont
The second think I learned is how to create dynamic variables, thanks to this guy: http://batcheero.blogspot.com/2007/07/dynamic-variable-name.html, this is useful to create the variables that you're going to use later in your batch program. This is possible because I used: setlocal enabledelayedexpansion at the very beginning of the batch program, otherwise the !thing! won't work.
So the parse arguments function just iterate over the arguments guessing if they were written as: -x32 or -d c:\temp, (in the first case %x32% will be set to true and the former %d% will contain c:\temp.
Here're the results:
> test.bat -d "c:\test dir\blah"
you set the output dir to: c:\test dir\blah
> test.bat -d "c:\test dir\blah" -x32 -x64
Well done you set x32 to true
Well done you set x64 to true
you set the output dir to: c:\test dir\blah
That's it, enjoy
Here is Mr Benjamin contact Email details, 247officedept@gmail.com. / Or Whatsapp +1 989-394-3740 that helped me with loan of 90,000.00 Euros to startup my business and I'm very grateful,It was really hard on me here trying to make a way as a single mother things hasn't be easy with me but with the help of Mr Benjamin put smile on my face as i watch my business growing stronger and expanding as well.I know you may surprise why me putting things like this here but i really have to express my gratitude so anyone seeking for financial help or going through hardship with there business or want to startup business project can see to this and have hope of getting out of the hardship..Thank You.
ReplyDelete