2017-09-26 91 views
0

我有一个用例,我想替换%% 20,它是字符串的一部分,例如:“Calculation %% 20One”。我想用“Calculation One”替换它。使用windows批处理脚本替换%% 20字符串

这地方我坚持:

@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

在批处理文件中,标准是将百分比翻倍为换码字符,因此请尝试将脚本更改为读取'%%%% 20'并再次尝试。 – Compo

回答

0

为什么选项将被写入到一个临时文件处理环境变量Option1Option2Option3的价值目前还不清楚我。看到定义了环境变量Option1Option2Option3的行,将会很好,因为它们分配给它们的实际值。

所以我在这里建议一个批处理文件,它可以替代%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。这是环境变量的名称,即Option1Option2Option3这个批处理文件。

对于每个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。输出空行。