我想要实现的目标
有一些符合特定模式的 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
并因元字符“&”而失败,它被解释为命令连接器而不是普通字符。
然后我尝试启用延迟扩展:
: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
最后我发现了问题并解决了它。
有几个特殊字符我忘记转义了。
!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));
}
}