为什么选项将被写入到一个临时文件处理环境变量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