使用Windows批处理脚本

时间:2017-09-26 00:53:53

标签: string batch-file replace batch-processing

我有一个用例,我想替换%% 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的组合。

由于

1 个答案:

答案 0 :(得分: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按字母顺序排序所有环境变量,以格式为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。这是环境变量的名称,即此批处理文件的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

此批处理代码替换%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。输出一个空行。