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 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: