Finalmente, descobri o problema e resolvi o problema.
Existem alguns caracteres especiais que esqueci de escapar.
!patt:(*)=%%i!
deve ser !patt:^(^*^)=%%i!
.
Como a expansão atrasada, (0,1,%~2)
também deve ser (0^,1^,%~2)
.
Então o código deve ser:
: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
A propósito, escrevi uma parte do código JScript que faz a mesma coisa.
/* 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));
}
}