FEST
FEST

Reputation: 883

Batch Removing double quotes or escaping properly ampersand

I want to execute some program passing an argument. The argument changes depending of the day of week and it is an url

Code:

@echo off
setlocal enableDelayedExpansion
for /f %%a in ('wmic path win32_localtime get dayofweek /format:list ^| findstr "="') do (set %%a)

if %dayofweek% == 7(
    EXIT
)
set link="http://backlog.telecom.pt/maps/selector/download?map_name=workline_fornecedores&organization_id=1"

if %dayofweek%==5 (
    set link="http://backlog.telecom.pt/maps/selector/download?map_name=all_fornecedores&organization_id=1"
)

REM start /wait D:\Planview\Services\BackLog_Integration_Client_Service\Backlog_Integration_Client_Exe\Backlog_Integration_Client_Exe.exe %link%
REM timeout /t 600 /nobreak > NUL
REM start D:\Planview\Services\PV_Backlog_ProcessData_Service\PV_Backlof_ProcessData_Exe\PV_Backlog_ProcessData_Exe.exe

I read that ^ before & would work to escape the & char, but for me it never did and the only way i managed to do it was enableDelayedExpansion and encapsulate the url in ", but this brought me a problem.. my variable instead of having the url has "url".

I tried to do set link=%link:"% but it did not worked.

Upvotes: 1

Views: 62

Answers (1)

dbenham
dbenham

Reputation: 130809

I'll try to give you some advice via simple examples:

@setlocal enableDelayedExpansion

rem This fails because & is a "poison" character (an instruction or operator)
echo abc&xyz

rem This succeeds because & is escaped
echo abc^&xyz

rem This succeeds because & is quoted
echo "abc&xyz"

rem This succeeds, but it consumes the escape: stored value = abc&xyz
set test=abc^&xyz

rem So this fails because & is not escaped
echo %test%

rem You could "fix" above by double escaping when doing SET so stored value = abc^&xyz
rem But I don't like this - I pretty much never do it
set test=abc^^^&xyz

rem Now this works
echo %test% 

rem Better to single escape and use delayed expansion.
set test=abc^&xyz
rem This works because poison characters don't bother delayed expansion
echo !test!

rem You could use quotes instead of escape, but now quotes are in value
set test="abc&xyz"
rem Delayed expansion is not needed because value is quoted
echo %test%

rem Putting the leading quote before the variable still quotes everything
rem But now the quotes are not in the value, as desired. Value = abc&xyz
set "test=abc&xyz"
rem Now you must use delayed expansion because value is not quoted
echo !test!

So the general rules of thumb that I like to use when poison characters are involved:

  • Use quotes around the entire assignment when SETting a variable: set "var=value"
  • Use delayed expansion when expanding a variable: !var!

Wouldn't it be nice if those rules solved everything. But of course batch is not that simple. There are situations where these simple rules will fail, but it should be enough to get you started.

Upvotes: 2

Related Questions