Чего я хочу достичь

Есть несколько URL, соответствующих определенному шаблону. сказать

http://example.com/page1.html?arg1=xxx&arg2=yyy
http://example.com/page2.html?arg1=xxx&arg2=yyy
....
http://example.com/page999.html?arg1=xxx&arg2=yyy

Обратите внимание, что в них есть специальные символы «&».

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

http://example.com/page(*).html?arg1=xxx&arg2=yyy

и (*) заменили числами 1,2,...,999 и сохраните его в файл (скажем, list.txt). Кавычки вокруг URL не допускаются.

Мой код и вопрос

Сначала я попробовал с таким кодом:

call :genlist "http://example.com/page(*).html?arg1=xxx&arg2=yyy" 999
exit /b

:genlist
:: given pattern abc(*), generate list abc0, abc1,abc2, ..., abc10, ... abc999 and save them to a file
:: parameters: %1 the pattern.
::             %2 the max number substituting the wildcard

set "patt=%~1"
( for /l %%i in (0,1,%~2) do @echo %patt:(*)=%%i %) >list.txt

exit /b

и потерпел неудачу из-за метасимвола «&», интерпретируемого как командный соединитель, а не как обычный символ.

Затем я попробовал enable-delayed-extension:

 :genlist
 setlocal enabledelayedexpansion
 set "patt=%~1"
 ( for /l %%i in (0,1,%~2) do @echo !patt:(*)=%%i!) >list.txt
 endlocal
 exit /b 

Это терпит неудачу из-за некоторого плохого вокруг %%i!) что я не понимаю.

И в третий раз я попытался процитировать это:

 :genlist
 setlocal enabledelayedexpansion
 set "patt=%~1"
 ( for /l %%i in (0,1,%~2) do @echo "!patt:(*)=%%i!") >list.txt
 endlocal
 exit /b 

Это работает, но вводит нежелательные цитаты в URL.

И у меня проблемы с тем, что эхо должно быть переменной, а не литеральной строкой. Если бы это было так, я бы смог избежать этого амперсанда.

Что я должен делать?

1 ответ1

0

Наконец я заметил проблему и решил ее.

Есть несколько специальных персонажей, от которых я забыл сбежать.

!patt:(*)=%%i! должно быть !patt:^(^*^)=%%i! ,

А поскольку это расширение с задержкой, (0,1,%~2) также должно быть (0^,1^,%~2) .

Так что код должен быть:

:genlist
:: given pattern abc(*), generate list abc0, abc1,abc2, ..., abc10, ... abc999 and save them to a list file
:: parameters: %1 the pattern.
::             %2 the max number substituting the wildcard.

setlocal enabledelayedexpansion
set "patt=%~1"
( for /l %%i in (0^,1^,%~2) do @echo !patt:^(^*^)=%%i! ) >list.txt
endlocal

exit /b

Кстати, я написал кусок кода JScript, который делает то же самое.

/* JScript: take a pattern of abc(*) and generate a list of abc0,abc1,abc2,...,abc999 
arg1: the pattern
arg2: the max number(not the count)

e.g.  
    cscript /nologo thisscript "http://example.com/page(*).html?arg1=xxx&arg2=yyy" 5

will write to stdout:

http://example.com/page0.html?arg1=xxx&arg2=yyy
http://example.com/page1.html?arg1=xxx&arg2=yyy
http://example.com/page2.html?arg1=xxx&arg2=yyy
http://example.com/page3.html?arg1=xxx&arg2=yyy
http://example.com/page4.html?arg1=xxx&arg2=yyy
http://example.com/page5.html?arg1=xxx&arg2=yyy
*/

with (WScript) {
    var pattern = Arguments.Item(0);
    var max_ind = Arguments.Item(1);

    for (var i=0; i<=max_ind; i+=1)
    {
        Echo (pattern.replace(/\(\*\)/g, i));
    }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .