views:

196

answers:

4

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%

Thanks ! joe

A: 

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.

call "script2.bat -pw:\"my;Password\""
tommieb75
I must not be understanding something, I thought I did put the command in double quotes, -pw:"my;Password" when it get to the FOR statement, hgowever it shows up as "-pm:"my Password"", the semi-colon is gone. It seems to have something to do with the "for" statement, since when in do echo %1 immediately before the "for" it shows up as -pw:"my;Password".
Joe Simon
Have you tried escaping the double quotes....? I will amend this accordingly...
tommieb75
Putting the quotes around the whole command line (other than the call) results in an error "The filename, directory name, or volume lable syntax is incorrect"
Joe Simon
Joe Simon
+1  A: 

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:

FOR /F "tokens=1,2 delims=:" %%a IN ( 'ECHO %1' ) DO ECHO Switch: %%a Value: %%b

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:

SET VALUE=%VALUE:~1,-1%

So this is the code I came up with:

ECHO OFF

ECHO Arguments: %1

FOR /F "tokens=1,2 delims=:" %%a IN ( 'ECHO %1' ) DO (
    SET SWITCH=%%a
    SET VALUE=%%b
)

ECHO SWITCH: %SWITCH%

SET VALUE=%VALUE:~1,-1%
ECHO VALUE: %VALUE%

...which returns the following results:

Arugments: -pw:"my;Password"
SWITCH: -pw
VALUE: my;Password

ewall
Close, I end up with an extra " at the endH:\My Documents\test>aH:\My Documents\test>echo onH:\My Documents\test>call b.bat -pw:"eat;me"H:\My Documents\test>ECHO OFFArguments: -pw:"eat;me"SWITCH: -pwVALUE: eat;me"
Joe Simon
Well, that showed up ugly...
Joe Simon
Are you sure you have the syntax correct for `SET VALUE=%VALUE:~1,-1%` ? That should remove the first and last characters, whatever they are...
ewall
I don't know what is going on. It always removes only the first character... maybe there are some spaces at the end that are not visible ? I will look into that.
Joe Simon
Yes, it was trailing spaces... Thanks for the Help !
Joe Simon
A: 

Try escaping the ; with a ^.

call script2.bat "-pw:my^;Password"
aphoria
A: 

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/

SkyLined