2017-09-26 133 views
0

我有一個用例,我想替換%% 20,它是字符串的一部分,例如:「Calculation %% 20One」。我想用「Calculation One」替換它。使用windows批處理腳本替換%% 20字符串

這地方我堅持:

@echo off 
setlocal enableextensions disabledelayedexpansion 

>"temp" (
    echo !Option1! 
    echo !Option2! 
    echo !Option3! 
) 

set "pattern=%%20" 

for /f "usebackq delims=" %%a in ("temp") do (
    echo data: %%a 

    set "line=%%a" 
    setlocal enabledelayedexpansion 
    if "!line:%pattern%=!"=="!line!" (
     set string=!Option1! 
     set string2=%!string1!:%%20= % 
    ) else (
     set string2=%%a 
    ) 
    endlocal 
) 

del /q tempFile 

是否有人可以幫助我?我有一個程序,它是批處理和python的組合。

感謝

+0

在批處理文件中,標準是將百分比翻倍爲換碼字符,因此請嘗試將腳本更改爲讀取'%%%% 20'並再次嘗試。 – Compo

回答

0

爲什麼選項將被寫入到一個臨時文件處理環境變量Option1Option2Option3的價值目前還不清楚我。看到定義了環境變量Option1Option2Option3的行,將會很好,因爲它們分配給它們的實際值。

所以我在這裏建議一個批處理文件,它可以替代%20,例如在HTML文件或電子郵件中通過所有Option環境變量中的空格字符。

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
set "Option1=Calculation%%20One" 
set "Option2=Calculation %%%%20Two!" 
set "Option3=Any other string" 

cls 
echo The options before processing: 
echo/ 
set Option 

for /F "delims==" %%I in ('set Option 2^>nul') do call :ProcessOption "%%I" 

echo/ 
echo The options after processing: 
echo/ 
set Option 
echo/ 
endlocal 
pause 
goto :EOF 

:ProcessOption 
setlocal EnableDelayedExpansion 
set "ModifiedOption=!%~1:%%20= !" 
endlocal & set "%~1=%ModifiedOption%" 
goto :EOF 

,有必要使用延遲擴展由一個空格字符替換的%20所有出現,因爲否則的Windows命令解釋將不知道在哪裏與字符串替換環境變量參考結束。出於這個原因,用百分號替換字符串是不可能的。

命令set Option輸出按字母順序排序的所有環境變量格式variable=value開始不區分大小寫用字符串Option,因爲它可以在運行該批處理文件可以看到兩次。

FOR執行單獨的命令處理此命令在後臺啓動,並捕捉由命令SET寫入處理STDOUT所有行。

字符串2^>nul最後執行如2>nul和由命令SET錯誤消息輸出重定向到處理STDERR到設備NUL抑制它。 SET將在當前環境中定義從Option開始沒有環境變量的情況下輸出錯誤消息。此批處理文件不會出現此錯誤情況。閱讀有關Using Command Redirection Operators的Microsoft文章。重定向運算符>在這裏必須用^進行轉義,以便在執行命令FOR(在後臺執行cmd.exe /c set Option 2>nul)之前,Windows命令解釋程序處理整個命令行時,首先將其解釋爲文字字符。

FOR由線處理set Option線的所捕獲的輸出和將每個排隊成子(令牌)使用與delims==指定的等號作爲分隔符。每行上第一個等號的字符串被分配給循環變量I。這是環境變量的名稱,即Option1Option2Option3這個批處理文件。

對於每個OptionX環境變量名稱,將調用子程序ProcessOption以用空格字符替換其值中的所有%20

這是一個環境變量的解決方案,帶有一個或多個變量名稱的感嘆號。

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
set "!Option1!=Calculation%%%%20One" 
set "!Option2!=City%%20Country" 
set "!Option3!=State%%%%20Country" 
set "!Option4!=Any other address/string" 

cls 
echo The options before processing: 
echo/ 
set !Option 

for /F "delims==" %%I in ('set !Option 2^>nul') do call :ProcessOption "%%I" 

echo/ 
echo The options after processing: 
echo/ 
set !Option 
echo/ 
endlocal 
pause 
goto :EOF 

:ProcessOption 
call set "ModifiedOption=%%%~1%%" 
setlocal EnableDelayedExpansion 
set "ModifiedOption=!ModifiedOption:%%%%20= !" 
set "ModifiedOption=!ModifiedOption:%%20= !" 
endlocal & set "ModifiedOption=%ModifiedOption%" 
set "%~1=%ModifiedOption%" 
set "ModifiedOption=" 
goto :EOF 

這個批處理代碼在比較上述通過環境變量與名稱Option開頭的空間僅更換%20替換所有的環境變量%20%%20開始!Option在名稱用空格字符。

對於Windows命令解釋程序(如字符&()[]{}^=;!'+,`~|<>%),在變量名中使用字符當然是個不錯的主意。如上所示,這是可能的,但絕對不是一個好主意。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • call /?
  • cls /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • set /?
  • setlocal /?

有關&操作員的解釋,另請參閱Single line with multiple commands using Windows batch file上的答案。

並閱讀DosTips論壇主題ECHO. FAILS to give text or blank line - Instead use ECHO/爲什麼最好使用echo/而不是echo。輸出空行。