使用 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.
的组合
谢谢
我不清楚为什么将选项写入临时文件以处理环境变量 Option1
、Option2
和 Option3
的值。如果能看到为分配给它们的实际值定义环境变量 Option1
、Option2
和 Option3
的行,那就太好了。
所以我在这里建议一个批处理文件,它用所有 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
。这是环境变量的名称,即此批处理文件的 Option1
、Option2
和 Option3
。
对于每个 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
更好。输出一个空行。
我有一个用例,我想替换 %%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.
的组合谢谢
我不清楚为什么将选项写入临时文件以处理环境变量 Option1
、Option2
和 Option3
的值。如果能看到为分配给它们的实际值定义环境变量 Option1
、Option2
和 Option3
的行,那就太好了。
所以我在这里建议一个批处理文件,它用所有 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
。这是环境变量的名称,即此批处理文件的 Option1
、Option2
和 Option3
。
对于每个 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
更好。输出一个空行。