Пакет Удаление двойных кавычек или эвакуация должным образом амперсанда

Я хочу выполнить некоторую программу, передающую аргумент. Аргумент изменяется в зависимости от дня недели, и это URL-адрес

Код:

@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

Я прочитал, что ^ before & будет работать, чтобы избежать & char, но для меня это никогда не делалось, и единственный способ, которым я это сделал, это включить DelayedExpansion и инкапсулировать URL-адрес в ", но это привело к возникновению проблемы.. моя переменная вместо имея url имеет "url".

Я попытался set link=%link:"% но это не сработало.

1 ответ

Я попробую дать вам несколько советов с помощью простых примеров:

@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 ****** 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!

Итак, общие эмпирические правила, которые мне нравятся, когда задействованы ядовитые персонажи:

  • Использовать кавычки вокруг всего присваивания при установке переменной: set "var=value"
  • Используйте расширенное расширение при расширении переменной !var!

Было бы неплохо, если бы эти правила все решили. Но, конечно, пакет не так прост. Бывают ситуации, когда эти простые правила терпят неудачу, но этого должно быть достаточно, чтобы вы начали.

licensed under cc by-sa 3.0 with attribution.