Processing Semicolon on Command line

batch-file, cmd, windows

Solution

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

Problem

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% ```

Original source