Windows 批处理:回显包含特殊字符的非文字字符串

Windows 批处理:回显包含特殊字符的非文字字符串

我想要实现的目标

有一些符合特定模式的 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));
    }
}

相关内容