我有一个用例,我想替换%% 20,它是字符串的一部分,例如:" Calculation %% 20One"。我想用"计算一"。
替换它我被困在哪里:
@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 :(得分:0)
我不清楚为什么将选项写入临时文件以处理环境变量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
按字母顺序排序所有环境变量,以格式为Option
的字符串variable=value
开始不区分大小写,因为在运行此批处理文件时可以看到两次。
FOR 在后台启动的单独命令进程中执行此命令,并捕获由命令 SET 写入的所有行以处理 STDOUT 。
字符串2^>nul
最终以2>nul
执行,并通过命令 SET 重定向输出的错误消息,以便将 STDERR 处理到设备 NUL 来压制它。如果在当前环境中未定义以Option
开头的环境变量, SET 将输出错误消息。此批处理文件不会发生此错误情况。阅读有关Using Command Redirection Operators的Microsoft文章。在执行命令 FOR之前,当Windows命令解释程序处理整个 FOR 命令行时,必须使用>
将重定向运算符^
转义为首先解释为文字字符。 ,在后台执行cmd.exe /c set Option 2>nul
。
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
此批处理代码替换%20
和%%20
在名称中以!Option
开头的所有环境变量中的空格字符,与上面的空格替换%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
。输出一个空行。