You will have to escape any of this characters by prefixing a caret::
()&%!"|
Main Topics
Browse All TopicsHi there,
Our application runs a Windows batch file passing in a string argument. This string is derived from customer data, and so it can contain quotes, ampersands, percentages and so on.
What is the best way of escaping these special characters s the data gets passed into the batch file correctly?
For example, we may call a batchfile 'lookup.bat' that accepts a Product Code as an argument. We recently had trouble with product codes containing ampersands so we changed it from running 'lookup ABC&123" to 'lookup "ABC&123"' That works fine. However, product codes legitimately containing quotes now cause a problem.
Can anyone offer any advice? We need to be able to handle quotes,ampersands and spaces in the same string.
For reference, the contents of this batchfile do something akin to the following:-
run lookup-program :"%1":
This format is required due to the programming language involved
Rob
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
Please read this reply carefully as it explores several possible solutions.
There is no way to selectively escape certain characters that are part of the command tail. For example, the '&' is used to separate commands therefore, entering something like the following:
BATCHFILE abc&123
would treat 'BATCHFILE abc' and '123' as two separate commands.
Consider the following line of code for example:
ECHO abc & ECHO 123
This consists of two echo commands which will result in the following output:
abc
123
Even if we remove the space between the 'c' and the '&' as in:
ECHO abc& ECHO 123
we would still get the same results - and of course, this is also the case if we remove the space between the '&' and the 'E' as in:
ECHO abc&ECHO 123
Unfortunately, there's no way to force DOS to treat the '&' as part of a string.
The only way to accept certain special characters is to pass them inside double-quotes as in the following example:
BATCHFILE "abc&123"
There should be no problem with this approach. You would normally pass this on to your LOOKUP program in the following manner:
LOOKUP %1
because the doubl-quotes are a part of the string (%1) and DOS would expand this to:
LOOKUP "abc&123"
However, your LOOKUP application expects to be called in the following format:
LOOKUP :code:
where 'code' is the data and 'code' is surrounded either side by ':' (colon) characters.
Furthermore, you state you are unable to pass double-quoted data to your LOOKUP application. Have you tried including the colons as part of the double-quoted string as in the following example:
SET Code=":%~1:"
LOOKUP %Code%
then call your batch file using double-quotes like this:
BATCHFILE "abc&123"
If that doesn't work, how about substituting the '&' with '^&' as in the following code:
SET Code=":%~1:"
SET Code=%Code:&=^&%
LOOKUP %Code%
or as in the following:
SET Code=%1
SET Code=:%Code:&=^&%:
LOOKUP %Code%
This is a tough one. I have explored probably every way of using redirection too however, I'm wondering if something like the following might work:
ECHO ":%~1:">Code.txt
LOOKUP <Code.txt
This last offering is a complete re-write to the previous idea of getting the ':code:' redirected onto the LOOKUP command line however, in order to that, the '&' has to be included in the text file being redirected but without the surrounding double-quotes.
What this program does:
Firstly, ignore everything past the label ':Dec2Hex' as this is self-explanatory - it takes a variable's name whose value is converted from decimal to hexadecimal. This is needed because the DEBUG only works with hexadecimal values.
The program starts by redirecting the parameter (the code) with surrounding colons inside sourrounding double-quotes to a file so that we can get the length of the code itself. Next various caluculations are carried out and converted to hexadecimal which will serve to tell DEBUG how to manipulate the code. Then, the DEBUG's instructions are assembled and written to a file which DEBUG will read in and carry out. Finlly, DEBUG is executed and this neatly removes the surrounding double-quotes from the code.
The last line: 'MORE <lookup.txt' should be changed to run your LOOKUP application as in: 'LOOKUP <lookup.txt'.
If you run the program as it stands, you will notice the output for "abc&123" is just :abc&123: - without the double-quotes and including the surrounding colons. Here's the batch file:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET Code=":%~1:"
ECHO %Code%>Lookup.txt
FOR %%a IN (Lookup.txt) DO SET FileLen=%%~za
SET /a FileLen-=2
SET /a CodeLen=FileLen-2
CALL :Dec2Hex FileLen
CALL :Dec2Hex CodeLen
SET /a Address=256+CodeLen
CALL :Dec2hex Address
>Lookup.bug ECHO m101 l %CodeLen% 100
>>Lookup.bug ECHO e%Address% 0d 0a
>>Lookup.bug ECHO rcx
>>Lookup.bug ECHO %FileLen%
>>Lookup.bug ECHO w
>>Lookup.bug ECHO q
>NUL DEBUG Lookup.txt <Lookup.bug
REM Change the next line to: LOOKUP <lookup.txt
MORE <Lookup.txt
EXIT /B
:Dec2Hex
SET Hex=
SET HexDigits=0123456789ABCDEF
SET h0=!%1!
:Loop
SET /A h1=%h0%/16
SET /A h3=%h0%-16*%h1%
SET h3=!HexDigits:~%h3%,1!
SET Hex=%h3%%Hex%
SET h0=%h1%
IF %h0% GTR 0 GOTO Loop
SET %1=%Hex%
EXIT /B
Well, it might be long but it's the only method I could think of at the time of writing after trying several other methds. This was tested working on an XP machine.
Business Accounts
Answer for Membership
by: sirbountyPosted on 2009-07-01 at 09:40:45ID: 24756041
Try using the escape character carat (^)
So,
lookup ABC^&123
does that work?