使用 windows 批处理脚本替换字符串中的 %%20

Replace %%20 in string using windows batch script

我有一个用例,我想替换 %%20,它是字符串的一部分,例如:"Calculation%%20One"。我想用 "Calculation One".

替换它

这是我卡住的地方:

@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.

的组合

谢谢

我不清楚为什么将选项写入临时文件以处理环境变量 Option1Option2Option3 的值。如果能看到为分配给它们的实际值定义环境变量 Option1Option2Option3 的行,那就太好了。

所以我在这里建议一个批处理文件,它用所有 Option 环境变量中的 space 字符替换 HTML 文件或电子邮件中的 %20

@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

有必要在用 space 字符替换所有出现的 %20 时使用延迟扩展,否则 Windows 命令解释器将不知道使用字符串替换引用环境变量的位置结束。出于这个原因,使用立即扩展无法用百分号替换字符串。

命令 set Option 输出按字母顺序排序的所有环境变量,以字符串 Option 开头且不区分大小写,格式为 variable=value,因为它可以在 运行 上看到两次批处理文件。

FOR 在后台启动的单独命令进程中执行此命令,并捕获命令 SET 写入的所有行以处理 标准输出.

字符串2^>nul最终执行为2>nul并将命令SET输出的错误信息重定向到处理STDERR 到设备 NUL 以抑制它。如果当前环境中没有定义以Option开头的环境变量,SET会输出错误信息。此批处理文件不会出现此错误情况。阅读有关 Using Command Redirection Operators 的 Microsoft 文章。重定向运算符 > 必须在此处使用 ^ 进行转义,以便在 Windows 命令解释器处理整个 FOR 命令行之前首先将其解释为文字字符执行命令 FOR 在后台执行 cmd.exe /c set Option 2>nul

FOR 逐行处理 set Option 的捕获输出,并将每行拆分为子字符串(标记),使用等号作为分隔符,如 delims==。每行第一个等号左边的字符串分配给循环变量I。这是环境变量的名称,即此批处理文件的 Option1Option2Option3

对于每个 OptionX 环境变量名称,调用子例程 ProcessOption 以将其值中的所有 %20 替换为 space 字符。

这里是针对变量名中带有一个或多个感叹号的环境变量的解决方法

@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 替换为 space 字符,与上面相比,仅替换 %20 在名称中以 Option 开头的环境变量中的 space。

在变量名中使用字符当然是个坏主意,这些字符对 Windows 命令解释器有特殊意义,例如字符 &()[]{}^=;!'+,`~|<>%。如上所示,这是可能的,但这绝对不是一个好主意。

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • 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 更好。输出一个空行。