爲什麼選項將被寫入到一個臨時文件處理環境變量Option1
,Option2
和Option3
的價值目前還不清楚我。看到定義了環境變量Option1
,Option2
和Option3
的行,將會很好,因爲它們分配給它們的實際值。
所以我在這裏建議一個批處理文件,它可以替代%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
。這是環境變量的名稱,即Option1
,Option2
和Option3
這個批處理文件。
對於每個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
。輸出空行。
在批處理文件中,標準是將百分比翻倍爲換碼字符,因此請嘗試將腳本更改爲讀取'%%%% 20'並再次嘗試。 – Compo