开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜