Processing Semicolon on Command line
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:
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
Try escaping the ; with a ^.
call script2.bat "-pw:my^;Password"
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\""
Instead of
for /F "tokens=1,2 delims=:" %%a in ( "%1" ) DO SET switch=%%a&value=%%b
use
for /F "tokens=1,2 delims=:" %%a in ( "%~1" ) DO SET switch="%%~a" & SET value="%%~b"
or (preferably, to my way of thinking)
for /F "tokens=1,2 delims=:" %%a in ( "%~1" ) DO (
SET switch="%%~a"
SET value="%%~b"
)
Check HELP CALL and HELP FOR to find out about the %~ syntax for quote removal.
精彩评论