簡體   English   中英

如何忽略替換批處理腳本中的字符串的URL中的&符號?

[英]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 /Freplace的值一起處理,然后由%%~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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM