[英]How to ignore the ampersand within an url for replacing a string in a batch script?
需要編寫批處理腳本,該腳本用html文檔中的URL替換變量。 URL來自用戶輸入。
@echo off
setlocal DisableDelayedExpansion
set /p vargs="Google Search: "
set "search=xxgs"
set "replace=%vargs%"
del output.html
for /F "delims=" %%a in (test.html) DO (
set line=%%a
setlocal EnableDelayedExpansion
>> output.txt echo(!line:%search%=%replace%!
endlocal
)
如果我粘貼一個Google URL(例如https://www.google.de/search?q=test&oq=test&aqs=chrome..69i57j69i60j69i65l3j69i60.704j0j9&sourceid=chrome&ie=UTF-8 ),則由於符號。
我如何才能停止對“&”號的解釋,而只用網址替換變量xxgs?
問題在於,“&”號(以及其他一些字符)對於cmd
具有特殊含義,並且您正在使用常規(立即)百分號擴展( %replace%
)擴展變量replace
的事實。
由於您使用嵌套在延遲擴展表達式(即子字符串替換!line:%search%=%replace%!
)中的此變量,因此不能將延遲擴展用於replace
。 但是,您可以通過for /F
循環中使用另一個循環來延遲值擴展,因為在處理特殊字符(如^
, &
, (
, )
, "
, <
, >
, |
)之后for
變量也會擴展:
@echo off
setlocal DisableDelayedExpansion
set "vargs="
set /p vargs="Google Search: "
set "search=xxgs"
set "replace=%vargs%"
> "output.txt" (
for /F "usebackq delims=" %%a in ("test.html") do (
set "line=%%a"
setlocal EnableDelayedExpansion
for /F "delims=" %%b in (""!replace!"") do (
echo(!line:%search%=%%~b!
)
endlocal
)
)
內部for /F
循環接收值!replace!
,稍后在%%~b
可用; 由於%%~b
line
的實際子串替換完成之前仍會擴展,因此可以提供預期的輸出。 for /F
刪除表達式""!replace!""
中的一對外引號,並告訴它將其余部分視為文字字符串(因為沒有usebackq
選項); 內部的一對""
由for /F
與replace
的值一起處理,然后由%%~b
的~
修飾符刪除; 使用此技巧,即使在replace
為空的情況下,循環也將執行,因為字符串for /F
顯示為""
(請注意,循環會忽略空的字符串/行),因此即使用戶在提示中未輸入任何內容,腳本也能正常工作。 如果您不希望出現這種情況,並在用戶輸入為空時跳過子字符串替換,只需刪除外部引號對""
並將%%~b
替換為%%b
。
請注意, replace
值中的感嘆號仍會導致意外結果,因為for
變量,在處理延遲擴展之前先對其進行擴展,這會消耗!
字符。
除此之外,我還更改了以下內容:
vargs
在提示set /P vargs=
之前被清除,因此,當用戶不輸入任何內容時, vargs
沒有輸入, set /P
會保留先前的值,因此vargs
確實為空; for /F
循環結構重定向到了文件output.txt
僅一次; 因為這允許使用>
運算符而不是>>
,所以不必再事先刪除輸出文件(盡管您刪除了output.html
而不是output.txt
,但是我認為這只是一個錯字); for /F
添加了usebackq
選項,並引用了文件路徑/名稱,因此它甚至可能包含空格或特殊字符。 set
的語法在循環結構中更改為引用的一set "line=%%a"
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.