Windows toplu iş: Özel karakterler içeren hazır olmayan dize eko


0

Ne elde etmek istiyorum

Belirli bir kalıba uyan birkaç URL vardır. söyle

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

İçlerinde '&' özel karakterleri olduğunu unutmayın.

Bu listeyi aşağıdaki örnekle oluşturmak istiyorum

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

ve (*)sayıları ile değiştirilir 1,2,...,999ve bir dosyaya kaydedin (say list.txt). URL'lerin çevresinde alıntı yapılmasına izin verilmez.

Kodum ve sorum

İlk önce böyle bir kodla denedim:

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

ve normal karakterden ziyade komut bağlayıcı olarak yorumlanan '&' meta karakteri nedeniyle başarısız oldu.

Sonra etkinleştirme gecikmeli genişlemesini denedim:

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

Bu, %%i!)anlamadığım bazı kötü nedeniyle başarısız olur .

Ve üçüncü kez, yankılanacak olanı alıntılamaya çalıştım:

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

Çalışır, ancak URL'ye istenmeyen alıntılar sunar.

Ve yankılanmanın değişmez olması, edebi bir dize değil, başım belada. Öyle olsaydı, doğrudan bu işaretten kaçabilirdim.

Ne yapmalıyım?


Ecamp @ amp; olarak teklif et ^&.
Akina

@Akina Sorun şu ki nerede olduğunu bilmiyoruz &: değişmez dizgeden ziyade değişkende.
Y.Lin

Yanıtlar:


0

Sonunda problemi farkettim ve çözdüm.

Kaçmayı unuttuğum birkaç özel karakter var.

!patt:(*)=%%i!olmalı !patt:^(^*^)=%%i!.

Ve bu gecikmeli genişleme olduğundan, (0,1,%~2)aynı zamanda olmalıdır (0^,1^,%~2).

Yani kod şöyle olmalı:

: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

Bu arada, aynı şeyi yapan bir parça JScript kodu yazdım.

/* 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));
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.