I have two batch files which is used to run a large C++ build, the first one starts the processes, creating directories and figuring out what to send to the second script. If certain information is presented to the first script, I have a routine that pops up a window and asks for a password. This is passed to the second script by calling the second script like this
call script2.bat -pw:myPassword
where myPassword is something the user entered. now, i have been testing this script and one of my users password contains a semicolon, so we get this
call script2.bat -pw:my;Password
I found by putting in quotes I can get this into the second script OK
call script2.bat -pw:"my;Password"
However, the command line parsing breaks when I try to do this
for /F "tokens=1,2 delims=:" %%a in ( "%1" ) DO SET switch=%%a&value=%%b
if I echo %1
it shows like this
-pw:"my;Password"
But with echo on when the script runs I see
for /F "tokens=1,2 delims=:" %%a in ( "-pw:"my Password"" ) DO SET switch=%%a&value=%%b
and it parses as switch=-pw
and value="my
What I eventually need is for value to contain my;Password so I can pass it to another program
Any ideas on how to get this to parse correctly
Here re 2 batch file that issulstrate the problem:
a.bat:
echo on
call b.bat -pw:eatme
call b.bat -pw:eat;me
call b.bat -pw:"eat;me"
call "b.bat -pw:\"eat;me\""
b.bat:
echo on
echo %1
for /F "tokens=1,2 delims=: " %%a in ( "%1" ) DO SET switch=%%a&SET value=%%b
echo switch=%switch%
echo value=%value%
I've created a batch "function" which does "proper" parsing of arguments and handles equal signs and semicolons correctly. I think you'll find that it can help you solve these problems. Full details and an example can be found on my site: http://skypher.com/index.php/2010/08/17/batch-command-line-arguments/
I found a little trick to get around the way the shell is interpreting the value of "%1" in the FOR /F loop: instead of parsing the string, parse the output of the command
ECHO %1
, like this:This works if you put the password in quotes on the command line (
call script2.bat -pw="my;password"
), so we'll have to remove the quotes as follows:So this is the code I came up with:
...which returns the following results:
Try escaping the ; with a ^.
Instead of
use
or (preferably, to my way of thinking)
Check HELP CALL and HELP FOR to find out about the %~ syntax for quote removal.
Try putting the script around in double quotes...the semicolon is a command separator so that you could type in multiple commands on the one line. The old days of DOS, and with DOSKEY, you could separate out the commands by hitting Ctrl+T, which is now the semicolon in today's command line processor. Do not worry about the quotes as the command processor will still be able to parse it, the reason the double quotes are used is to get around the long filename/path conventions.